2016-10-21 2 views
1

Вот мой кодСохранение DataSet <Row> воспламенить

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 по себе (здесь Ключ 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); 
} 
+0

Я также сталкиваюсь с аналогичной проблемой. Как вы ее решили? – aks

ответ

1

Пар соображения:

  • Имя типа (один передается метода builder()) должен быть значимым именем, представляющее типа данных. Не используйте для этого имя класса BinaryObject.
  • setIndexedTypes(BinaryObject.class, BinaryObject.class) является неправильным. Это должно указывать классы для обработки аннотаций запросов. Если у вас нет классов, вы можете использовать QueryEntity для настройки запросов. Дополнительную информацию см. На этой странице: https://apacheignite.readme.io/docs/sql-queries

Кроме этого кода выглядит правильно. Я бы рекомендовал попробовать с настройками по умолчанию и проверить, работает ли он таким образом. Также не совсем понятно, как вы проверяете, что данные находятся в кеше или нет.

+0

Так что мне просто нужно узнать немного больше о моей второй части вопроса. Я обновил код для сохранения 'DataSet ' используя метод 'SavePairs'' IgniteRdd'. Здесь вы можете видеть, что я использую хэш значений для генерации ключа, который я не чувствую, это правильный способ сделать это. Не могли бы вы добавить немного света при создании 'BinaryObject' как' Key'. – eatSleepCode

+0

Вы должны определить свою модель данных о значении ключа. Обычно в каждой строке есть поле ИД (или что-то подобное), которое можно использовать в качестве ключа. Обратите внимание, что на самом деле у вас нет 'BinaryObject'. Если есть только одно поле (строка, длина и т. Д.), Просто используйте его как есть. –

Смежные вопросы