Ключ Spark Cassandra Connector для перетасовки

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

Я использую cassandraTable для создания RDD.

Имена столбцов семейства столбцов являются динамическими, поэтому оно определяется следующим образом:

CREATE TABLE "Profile" (
  key text,
  column1 text,
  value blob,
  PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE AND
  bloom_filter_fp_chance=0.010000 AND
  caching='ALL' AND
  ...

Это определение приводит к созданию элементов RDD CassandraRow в следующем формате:

CassandraRow <key, column1, value>
  • ключ - RowKey
  • column1 - значение column1 является именем динамического столбца
  • value - значение динамического столбца

Таким образом, если у меня RK = 'profile1' с столбцами name = 'George' и age = '34 ', результирующая RDD будет такой:

CassandraRow<key=profile1, column1=name, value=George>
CassandraRow<key=profile1, column1=age, value=34>

Затем мне нужно сгруппировать элементы, которые используют один и тот же ключ, чтобы получить PairRdd:

PairRdd<String, Iterable<CassandraRow>>

Важно отметить, что все элементы, которые мне нужно сгруппировать, находятся в одном узле Cassandra (совместно используют один и тот же ключ строки), поэтому я ожидаю, что соединитель сохранит локальность данных.

Проблема в том, что использование groupBy или groupByKey вызывает тасование. Я предпочитаю группировать их локально, потому что все данные находятся на одном узле:

JavaPairRDD<String, Iterable<CassandraRow>> rdd = javaFunctions(context)
        .cassandraTable(ks, "Profile")
        .groupBy(new Function<ColumnFamilyModel, String>() {
            @Override
            public String call(ColumnFamilyModel arg0) throws Exception {
                return arg0.getKey();
            }
        })

Мои вопросы:

  1. Приведет ли использование keyBy к СДР к перестановкам или будет хранить данные локально?
  2. Есть ли способ сгруппировать элементы по ключу без перемешивания? Я читал о mapPartitions, но не совсем понял, как его использовать.

Спасибо,

Шай

4 голоса | спросил Shai 11 MarpmWed, 11 Mar 2015 12:11:59 +03002015-03-11T12:11:59+03:0012 2015, 12:11:59

1 ответ


0

Я думаю, что вы ищете spanByKey, специфическую для коннектора cassandra операцию, которая использует упорядочение, предоставляемое cassandra для разрешения группировки элементов без возникновения в случайном порядке.

В вашем случае это должно выглядеть так:

sc.cassandraTable("keyspace", "Profile")
  .keyBy(row => (row.getString("key")))
  .spanByKey

Подробнее читайте в документации:
https://github.com/datastax/spark-cassandra-connector/blob/master/doc/3_selection.md#grouping-rows-by-partition-key

ответил maasg 11 MarpmWed, 11 Mar 2015 18:07:39 +03002015-03-11T18:07:39+03:0006 2015, 18:07:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132