将DataSet <row>保存为Ignite

时间:2016-10-21 06:20:20

标签: apache-spark ignite

这是我的代码

public static void save(IgniteContext igniteContext, String cacheName, Dataset<Row> dataSet) {
        CacheConfiguration<BinaryObject, BinaryObject> cacheConfiguration = new CacheConfiguration<BinaryObject, BinaryObject>(cacheName)
                .setAtomicityMode(CacheAtomicityMode.ATOMIC)
                .setBackups(0)
                .setAffinity(new RendezvousAffinityFunction(false, 2))
                .setIndexedTypes(BinaryObject.class, BinaryObject.class);
        IgniteCache<BinaryObject, BinaryObject> rddCache = igniteContext.ignite()
                .getOrCreateCache(cacheConfiguration)
                .withKeepBinary();
        rddCache.clear();
        IgniteRDD<BinaryObject, BinaryObject> igniteRDD = igniteContext.fromCache(cacheName);
        StructField[] fields = dataSet.schema().fields();
        RDD<BinaryObject> binaryObjectJavaRDD = dataSet.toJavaRDD().map(row -> {
            BinaryObjectBuilder valueBuilder = igniteContext.ignite().binary().builder(BinaryObject.class.getCanonicalName());
            for (int i = 0; i < fields.length; i++) {
                valueBuilder.setField(fields[i].name(), convertValue(String.valueOf(row.get(i)), fields[i].dataType())); //convertValue converts value to specific datatype
            }
            return valueBuilder.build();
        }).rdd();

        igniteRDD.saveValues(binaryObjectJavaRDD);
}

我上面的代码有问题,即使成功完成此方法后,缓存仍为空。 Dataset有20行,所以这不是问题。

另一个问题是,如果我使用savePairs中的IgniteRDD方法,那么我必须自己生成Key(此处Key为BinaryObject),所以如何那样做?

更新

saveDFInPairs(IgniteContext igniteContext, Dataset<Row> dataSet, IgniteRDD<BinaryObject, BinaryObject> igniteRDD) {
    StructField[] fields = dataSet.schema().fields();
    JavaRDD<Tuple2<BinaryObject, BinaryObject>> rdd = dataSet.toJavaRDD().map(row -> {
        BinaryObjectBuilder keyBuilder = igniteContext.ignite()
                        .binary().builder("TypeName");
        keyBuilder.setField("id", row.mkString().hashCode());
        BinaryObject key = keyBuilder.build();

        BinaryObjectBuilder valueBuilder = igniteContext.ignite()
                       .binary().builder("TypeName");
        for (int i = 0; i < fields.length; i++) {
            valueBuilder.setField(fields[i].name(), convert(row, i, fields[i].dataType())); 
        }
        BinaryObject value = valueBuilder.build();
        return new Tuple2<>(key, value);
    });

    igniteRDD.savePairs(rdd.rdd(), true);
}

1 个答案:

答案 0 :(得分:1)

一些注意事项:

  • 类型名称(传递给builder()方法的名称)应该是表示数据类型的有意义的名称。请勿使用BinaryObject类名称。
  • setIndexedTypes(BinaryObject.class, BinaryObject.class)不正确。这应该指定要为查询注释处理的类。如果您没有课程,则可以使用QueryEntity配置查询。有关详细信息,请参阅此页面:foreign key

除了该代码看起来正确。我建议尝试使用默认设置并检查它是否以这种方式工作。此外,您还不清楚如何检查数据是否在缓存中。