Apache Ignite 在分布式缓存中存储 JSON 地图
Apache Ignite storing JSON Map in distributed cache
我写了下面的代码从 JSON 文件中读取数据并将其推送到 Ignite 分布式缓存中,这段代码工作正常,但是,创建 "ContainerAgg" class 的要求是对我来说是个问题。我们的数据结构不是预定义的,提取物是根据用户选择动态生成的。
我尝试使用 BinaryObject 但是当我使用 BinaryObject 时我无法 运行 一个 SQL 查询,你有没有使用 BinaryObject 并且不使用预编译的示例 java class 架构。
有这个"StreamVisitorExample",然而,这个使用预编译Java Class (Instrument.class)
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
if (!ExamplesUtils.hasServerNodes(ignite))
return;
CacheConfiguration<String, ContainerAgg> config = new CacheConfiguration<>(MASSIVE_CACHE);
config.setIndexedTypes(String.class, ContainerAgg.class);
ignite.getOrCreateCache(config);
try (BufferedReader br = new BufferedReader(new FileReader(args[0]))) {
IgniteCache<String, ContainerAgg> cache = Ignition.ignite().cache(MASSIVE_CACHE);
String line = null;
Long cnt = 0L;
while ((line = br.readLine()) != null) {
ContainerAgg inst = mapper.readValue(line, ContainerAgg.class);
cache.put(cnt.toString(), inst);
cnt++;
}
long startTime = System.currentTimeMillis();
String sql =
"SELECT SFID, LABEL, PARTID, PROVIDERID, SUM(TOTALCNT) "
+ "FROM CONTAINERAGG GROUP BY SFID, LABEL, PARTID, PROVIDERID";
QueryCursor<List<?>> cursor = cache.query(new SqlFieldsQuery(sql));
long endTime = System.currentTimeMillis();
for (List<?> row : cursor.getAll()){
System.out.println(row);
}
System.out.println("Total Time: " + (endTime - startTime));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
为了让您了解我对 BinaryObject
所做的事情的更多背景信息。我将 JSON 转换为 map
并在 BinaryObjectBuilder
中添加了每个条目并创建了 BinaryObject
实例并将其存储在 IgniteCache<String, BinaryObject>
中
BinaryObject
是要走的路。要 运行 SQL 查询,您需要通过 CacheConfiguration.QueryEntities
配置索引字段(参见 https://apacheignite.readme.io/docs/indexes#queryentity-based-configuration)。
但是,您只能为缓存配置一次查询实体。因此,当您的架构发生变化时,您必须 destroy
缓存并创建一个具有更新的 QueryEntity
配置的新缓存。
此用例没有 Java 示例。但是,您可以查看 C# 示例,API 非常相似:
https://github.com/apache/ignite/blob/master/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Datagrid/BinaryModeExample.cs
我写了下面的代码从 JSON 文件中读取数据并将其推送到 Ignite 分布式缓存中,这段代码工作正常,但是,创建 "ContainerAgg" class 的要求是对我来说是个问题。我们的数据结构不是预定义的,提取物是根据用户选择动态生成的。
我尝试使用 BinaryObject 但是当我使用 BinaryObject 时我无法 运行 一个 SQL 查询,你有没有使用 BinaryObject 并且不使用预编译的示例 java class 架构。
有这个"StreamVisitorExample",然而,这个使用预编译Java Class (Instrument.class)
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
if (!ExamplesUtils.hasServerNodes(ignite))
return;
CacheConfiguration<String, ContainerAgg> config = new CacheConfiguration<>(MASSIVE_CACHE);
config.setIndexedTypes(String.class, ContainerAgg.class);
ignite.getOrCreateCache(config);
try (BufferedReader br = new BufferedReader(new FileReader(args[0]))) {
IgniteCache<String, ContainerAgg> cache = Ignition.ignite().cache(MASSIVE_CACHE);
String line = null;
Long cnt = 0L;
while ((line = br.readLine()) != null) {
ContainerAgg inst = mapper.readValue(line, ContainerAgg.class);
cache.put(cnt.toString(), inst);
cnt++;
}
long startTime = System.currentTimeMillis();
String sql =
"SELECT SFID, LABEL, PARTID, PROVIDERID, SUM(TOTALCNT) "
+ "FROM CONTAINERAGG GROUP BY SFID, LABEL, PARTID, PROVIDERID";
QueryCursor<List<?>> cursor = cache.query(new SqlFieldsQuery(sql));
long endTime = System.currentTimeMillis();
for (List<?> row : cursor.getAll()){
System.out.println(row);
}
System.out.println("Total Time: " + (endTime - startTime));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
为了让您了解我对 BinaryObject
所做的事情的更多背景信息。我将 JSON 转换为 map
并在 BinaryObjectBuilder
中添加了每个条目并创建了 BinaryObject
实例并将其存储在 IgniteCache<String, BinaryObject>
BinaryObject
是要走的路。要 运行 SQL 查询,您需要通过 CacheConfiguration.QueryEntities
配置索引字段(参见 https://apacheignite.readme.io/docs/indexes#queryentity-based-configuration)。
但是,您只能为缓存配置一次查询实体。因此,当您的架构发生变化时,您必须 destroy
缓存并创建一个具有更新的 QueryEntity
配置的新缓存。
此用例没有 Java 示例。但是,您可以查看 C# 示例,API 非常相似: https://github.com/apache/ignite/blob/master/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Datagrid/BinaryModeExample.cs