Конвертируйте два столбца в фрейме данных pyspark в один словарь Python - PullRequest
0 голосов
/ 16 апреля 2019

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

входной кадр данных pyspark:

col1|col2|col3
v   |  3 | a
d   |  2 | b
q   |  9 | g

выход:

dict = {'v': 3, 'd': 2, 'q': 9}

как мне сделать это эффективно?

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

здесь несколько разных опций в зависимости от необходимого формата ... проверьте это ... я использую структурированный api ... если вам нужно сохранить, то либо сохраните как json dict, либо сохраните схему с паркетом

from pyspark.sql.functions import to_json
from pyspark.sql.functions import create_map
from pyspark.sql.functions import col

df = spark\
.createDataFrame([\
    ('v', 3, 'a'),\
    ('d', 2, 'b'),\
    ('q', 9, 'g')],\
    ["c1", "c2", "c3"])

mapDF = df.select(create_map(col("c1"), col("c2")).alias("mapper"))
mapDF.show(3)

+--------+
|  mapper|
+--------+
|[v -> 3]|
|[d -> 2]|
|[q -> 9]|
+--------+

dictDF = df.select(to_json(create_map(col("c1"), col("c2")).alias("mapper")).alias("dict"))
dictDF.show()

+-------+
|   dict|
+-------+
|{"v":3}|
|{"d":2}|
|{"q":9}|
+-------+

keyValueDF = df.selectExpr("(c1, c2) as keyValueDict").select(to_json(col("keyValueDict")).alias("keyValueDict"))
keyValueDF.show()

+-----------------+
|     keyValueDict|
+-----------------+
|{"c1":"v","c2":3}|
|{"c1":"d","c2":2}|
|{"c1":"q","c2":9}|
+-----------------+
1 голос
/ 17 апреля 2019

Я полагаю, что вы можете добиться этого, преобразовав DF (с двумя нужными столбцами) в rdd:

data_rdd = data.selet(['col1', 'col2']).rdd

создайте ключ, содержащий rdd, соединяемый с обоими столбцами, используя функцию rdd.map:

kp_rdd = data_rdd.map(lambda row : (row[0],row[1]))

, а затем собирать в виде карты:

dict = kp_rdd.collectAsMap()

это основная идея, извините, у меня нет сейчас запущенного экземпляра pyspark для его проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...