我有一个pyspark数据框,如下所示:
+----+--------------------+
| ID| Email|
+----+--------------------+
| 1| sample@example.org|
| 2| sample2@example.org|
| 3| sampleexample.org|
| 4| sample@exampleorg|
+----+--------------------+
我需要做的是将其拆分为多个块,然后将这些块转换为字典,如:
chunk1
[{'ID': 1, 'Email': 'sample@example.org'}, {'ID': 2, 'Email': 'sample2@example.org'}]
chunk2
[{'ID': 3, 'Email': 'sampleexample.org'}, {'ID': 4, 'Email': 'sample@exampleorg'}]
我在SO上找到了this post,但我认为先将这些块转换为pandas数据帧,再从那里转换为字典并没有任何意义,尽管我可以直接做到这一点。使用该文章中的想法,我得到了以下代码,但不确定这是否是最好的方法:
columns = spark_df.schema.fieldNames()
chunks = spark_df.repartition(num_chunks).rdd.mapPartitions(lambda iterator: [iterator.to_dict('records')]).toLocalIterator()
for list_of_dicts in chunks:
# do work locally on list_of_dicts
答案 0 :(得分:0)
您可以在mapPartitions函数中返回[[x.asDict() for x in iterator]]
(不需要Pandas)。 [x.asDict() for x in iterator]
创建一个字典列表,包括同一分区中的所有行。然后,我们使用另一个列表将其括起来,以便使用toLocalIterator()
将其视为单个项目:
from json import dumps
num_chunks = 2
chunks = spark_df.repartition(num_chunks).rdd.mapPartitions(lambda iterator: [[x.asDict() for x in iterator]]).toLocalIterator()
for list_of_dicts in chunks:
print(dumps(list_of_dicts))
#[{"ID": "2", "Email": "sample2@example.org"}, {"ID": "1", "Email": "sample@example.org"}]
#[{"ID": "4", "Email": "sample@exampleorg"}, {"ID": "3", "Email": "sampleexample.org"}]