Конвертировать искровой фрейм в список кортежей без панд - PullRequest
0 голосов
/ 15 октября 2019

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

list(zip(*[df[c].values.tolist() for c in df])) 

где df - фрейм данных панд.

Кто-нибудь, пожалуйста, помогите мне реализовать ту же логику без панд вpyspark.

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Альтернатива без collect, но с collect_list

import pyspark.sql.functions as F

df.show()
+-----+-----+
| Name|Score|
+-----+-----+
|name1|11.23|
|name2|14.57|
|name3| 2.21|
|name4| 8.76|
|name5|18.71|
+-----+-----+

@F.udf
def combo(*args):
  return [_ for _ in args][0]

df.withColumn('Combo', combo(F.array('Name','Score'))).agg(F.collect_list('Combo')).show(truncate=False)

+--------------------------------------------------------------------------+
|collect_list(Combo)                                                       |
+--------------------------------------------------------------------------+
|[[name1, 11.23],[name2, 14.57],[name3, 2.21],[name4, 8.76],[name5, 18.71]]|
+--------------------------------------------------------------------------+



0 голосов
/ 15 октября 2019

Вы можете сначала преобразовать dataframe в RDD, используя метод rdd. A Row в кадрах данных тоже tuple, поэтому вы можете просто:

rdd = df.rdd
b = rdd.map(tuple)
b.collect()

Пример DF:

df.show()
+-----+-----+
| Name|Score|
+-----+-----+
|name1|11.23|
|name2|14.57|
|name3| 2.21|
|name4| 8.76|
|name5|18.71|
+-----+-----+

После b.collect()

[('name1', 11.23), ('name2', 14.57), ('name3', 2.21), ('name4', 8.76), ('name5', 18.71)]

РЕДАКТИРОВАТЬ

Если вы собираетесь перебирать этот список кортежей, вы можете позвонить collect(), но правильный метод - toLocalIterator()

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