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