Как эффективно превратить DataFrame в карту (имя столбца -> список значений столбца) - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь достичь следующего фрейма данных:

-------------------------
| FOO   | BAR   | BAZ   |
| lorem | ipsum | dolor |
| sit   | amet  | dolor |
| lorem | lorem | dolor |
-------------------------

Создать следующий вывод:

Map(
 FOO -> List("lorem", "sit"),
 BAR -> List("ipsum", "amet", "lorem"),
 BAZ -> List("dolor")
)

Это код Scala, который я получилс:

val df = data.distinct

df.columns.map((key) => {
  val distinctValues = df
    .select(col(key))
    .collect
    .map(df => df.getString(0))
    .toList
    .distinct
  (key, distinctValues)
}).toMap

Я пробовал близкую альтернативу этому коду, используя RDD, и почему-то они примерно на 30% быстрее, но проблема остается той же: все это чрезвычайно неэффективно.

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

Я что-то не так делаю, есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

У вас есть функция с именем collect_set

df.select(collect_set($"FOO"), collect_set($"BAR"), collect_set($"BAZ"))
0 голосов
/ 17 декабря 2018

Чтобы определить уникальные значения столбца

for (x<- df.columns)
{
df.select(x).groupBy(x).count
}

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

import org.apache.spark.sql.functions.approx_count_distinct
df.agg(approx_count_distinct("some_column"))

Это хороший пост от zero323, объясняющий это>>

Как подсчитать вхождения каждого отдельного значения для каждого столбца в кадре данных?

...