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

时间:2019-11-07 21:34:30

标签: python 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

1 个答案:

答案 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"}]