将pyspark数据帧拆分为块并转换为字典

我有一个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
introject 回答:将pyspark数据帧拆分为块并转换为字典

您可以在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"}]
本文链接:https://www.f2er.com/3141501.html

大家都在问