Pyspark:数据框的字典列表
Posted
技术标签:
【中文标题】Pyspark:数据框的字典列表【英文标题】:Pyspark : list of dictionaries to data frame 【发布时间】:2018-01-31 10:39:57 【问题描述】:我有一个数据框,其中有一列,每一行都包含一个字典列表:
[
Row(payload=u"['key1':'value1','key2':'value2','key3':'value3',...]"),
Row(payload=u"['key1':'value1','key2':'value2','key3':'value3',...]")
]
如何将其解析为这样的数据帧结构:
key1 | key2 | key3 | keyN |
value1|value2|value3|valueN|
value1|value2|value3|valueN|
【问题讨论】:
您可以查看from_json 以达到您的目的。 How to cast string to ArrayType of dictionary (JSON) in PySpark的可能重复 【参考方案1】:您可以按照以下方式进行:
from pyspark.sql import Row
l = [Row(payload=u"['key1':'value1','key2':'value2','key3':'value3']"),
Row(payload=u"['key1':'value1','key2':'value2','key3':'value3']")]
# convert the list of Rows to an RDD:
ll = sc.parallelize(l)
df = sqlContext.read.json(ll.map(lambda r: dict(
kv for d in eval(r.payload) for kv in d.items())))
说明:
我猜唯一的歧义在于以下中间代码:
dict(kv for d in eval(r.payload) for kv in d.items())
用于从这种格式转换
['key1':'value1','key2':'value2','key3':'value3']"
到这个:
'key3': 'value3', 'key2': 'value2', 'key1': 'value1'
输出:
>>>df
DataFrame[key1: string, key2: string, key3: string]
>>> df.show()
+------+------+------+
| key1| key2| key3|
+------+------+------+
|value1|value2|value3|
|value1|value2|value3|
+------+------+------+
【讨论】:
@TCreuillenet,很高兴我能提供帮助 :),考虑接受答案 ;) 实际上这个结果给出了一些我想添加到原始数据框中的列。最好的方法是什么? 令我惊讶的是,来自 OP 的问题和接受的答案都被否决了否定分... @devinbost:*** 应该受到更多投票者的限制。在接受反对票之前应该进行某种验证。现在它只基于用户的排名。【参考方案2】:要获得预期的数据帧结构:
import pandas as pd
from pyspark.sql import *
dataframe = [
Row(payload=u"['key1':'value1','key2':'value2','key3':'value3']"),
Row(payload=u"['key1':'value4','key2':'value5','key3':'value6']")]
new_data = [eval(row['payload']) for row in dataframe]
# [['key1': 'value1', 'key2': 'value2', 'key3': 'value3'], ['key1': 'value4', 'key2': 'value5', 'key3': 'value6']]
data_list = []
for sub_list in new_data:
dict_list =
for dict_val in sub_list:
dict_list.update(dict_val)
data_list.append(dict_list)
# ['key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'key1': 'value4', 'key2': 'value5', 'key3': 'value6']
df = pd.DataFrame(data_list)
# key1 key2 key3
# 0 value1 value2 value3
# 1 value4 value5 value6
【讨论】:
谢谢,但它会产生重复,很多行和列...以上是关于Pyspark:数据框的字典列表的主要内容,如果未能解决你的问题,请参考以下文章
将标准 python 键值字典列表转换为 pyspark 数据框