PySpark - Как передать список в функцию определения пользователя? - PullRequest
1 голос
/ 07 января 2020

У меня есть DataFrame с 2 столбцами. Столбец 1 - это «код», который может повторяться более 1 раза, а столбец 2 - это «Значения». Например, столбец 1 равен 1,1,1,5,5, а столбец 2 - 15,18,24,38,41. Я хочу сначала отсортировать по 2 столбцам ( df.sort("code","Values") ), а затем выполнить ("groupBy" "Code") и (agg Values), но я хочу применить UDF к значениям, поэтому мне нужно передать «Значения» каждого кода в качестве «списка» на UDF. Я не уверен, сколько «ценностей» будет иметь каждый код. Как вы можете видеть в этом примере, «Код» 1 имеет 3 значения, а «Код» 5 имеет 2 значения. Поэтому для каждого «кода» мне нужно передать все «значения» этого «кода» в виде списка в UDF.

1 Ответ

1 голос
/ 07 января 2020

Вы можете сделать groupBy, а затем использовать функцию collect_set или collect_list в pyspark. Ниже приведен примерный фрейм данных вашего варианта использования (надеюсь, это то, на что вы ссылаетесь):

from pyspark import SparkContext
from pyspark.sql import HiveContext


sc = SparkContext("local")

sqlContext = HiveContext(sc)

df = sqlContext.createDataFrame([
    ("code1", "val1"),
    ("code1", "val2"),
    ("code1", "val3"),
    ("code2", "val1"),
    ("code2", "val2"),
], ["code", "val"])

df.show()
    +-----+-----+
    | code| val |
    +-----+-----+
    |code1|val1 |
    |code1|val2 |
    |code1|val3 |
    |code2|val1 |
    |code2|val2 |
    +---+-------+

Теперь команда groupBy и collect_list:

(df
  .groupby("code")
  .agg(F.collect_list("val"))
  .show())

Вывод:

+------+------------------+
|code  |collect_list(val) |
+------+------------------+
|code1 |[val1, val2, val3]|
|code2 |[val1, val2]      |
+------+------------------+

Здесь выше вы получаете список агрегированных значений во втором столбце

...