Удалить дубликаты без перемешивания Spark

У меня есть таблица Cassandra XYX со столбцами (id uuid, вставьте метку времени, текст заголовка)

Где id и insert - составной первичный ключ.

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

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

После получения я использую dropDuplicates для получения отдельных записей.


person faith    schedule 18.03.2017    source источник


Ответы (1)


Spark Dataframe API пока не поддерживает настраиваемые разделители. Таким образом, Connector не смог ввести секционер C * в движок Dataframe. RDD Spark API с другой стороны поддерживает настраиваемый разделитель. Таким образом, вы можете загрузить свои данные в RDD, а затем скрыть их в df. Вот документ Connector об использовании разделителя C *: https://github.com/datastax/spark-cassandra-connector/blob/master/doc/16_partitioning.md

Функция keyBy () позволяет вам определять ключевые столбцы, которые будут использоваться для группировки

Вот рабочий пример. Он не короткий, поэтому я думаю, что кто-то сможет его улучшить:

//load data into RDD and define a group key
val rdd = sc.cassandraTable[(String, String)] ("test", "test")
   .select("id" as "_1", "header" as "_2")
   .keyBy[Tuple1[Int]]("id")
// check that partitioner is CassandraPartitioner
rdd.partitioner
// call distinct for each group, flat it, get two column DF
val df = rdd.groupByKey.flatMap {case (key,group) => group.toSeq.distinct}
    .toDF("id", "header")
person Artem Aliev    schedule 19.04.2017