Как найти отличительные значения нескольких столбцов в Spark - PullRequest
0 голосов
/ 02 июня 2019

У меня есть СДР, и я хочу найти различные значения для нескольких столбцов.

Пример:

Row(col1=a, col2=b, col3=1), Row(col1=b, col2=2, col3=10)), Row(col1=a1, col2=4, col3=10)

Я хотел бы найти карту:

col1=[a,b,a1]
col2=[b,2,4]
col3=[1,10]

Может ли фрейм данных помочь вычислить его быстрее / проще?

Обновление:

Мое решение с RDD было:


def to_uniq_vals(row):
   return [(k,v) for k,v in row.items()]

rdd.flatMap(to_uniq_vals).distinct().collect()

Спасибо

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Надеюсь, я правильно понял ваш вопрос; Вы можете попробовать следующее:

import org.apache.spark.sql.{functions => F}
val df = Seq(("a", 1, 1), ("b", 2, 10), ("a1", 4, 10))
df.select(F.collect_set("_1"), F.collect_set("_2"), F.collect_set("_3")).show

Результаты:

+---------------+---------------+---------------+
|collect_set(_1)|collect_set(_2)|collect_set(_3)|
+---------------+---------------+---------------+
|     [a1, b, a]|      [1, 2, 4]|        [1, 10]|
+---------------+---------------+---------------+

Код выше должен быть более эффективным, чем намеченный select distinct столбец за столбцом по нескольким причинам:

  1. Меньше рабочих-организаторов.
  2. Отключение должно быть выполнено локально на работнике до разъединения между работниками.

Надеюсь, это поможет!

0 голосов
/ 02 июня 2019

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

>>> rdd.collect()
[Row(col1='a', col2='b', col3=1), Row(col1='b', col2=2, col3=10), Row(col1='a1', col2=4, col3=10)]
>>> df=rdd.toDF()
19/06/02 18:13:25 WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   a|   b|   1|
|   b|   2|  10|
|  a1|   4|  10|
+----+----+----+

>>> df.select(df['col1']).distinct().show()
+----+
|col1|
+----+
|  a1|
|   b|
|   a|
+----+

>>> df.select(df['col2']).distinct().show()
+----+
|col2|
+----+
|   b|
|   4|
|   2|
+----+

>>> df.select(df['col3']).distinct().show()
+----+
|col3|
+----+
|   1|
|  10|
+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...