Pyspark:将具有不同键的rdd转换为spark datafram

2024-04-24 14:59:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一种情况,即我的rdd键在每个字典中不同,有些有更多和不同的键比其他人。你知道吗

因此,我无法使用toDF()直接转换它们。有人有更好的主意吗?你知道吗

list1 = [{'this':'bah', 'is': 'bah'}, 
         {'this': 'true', 'is': 'false'}, 
         {'this': 'true', 'is': 'false', 'testing':'bah'}]

rdd = sc.parallelize(list1)
rdd.map(lambda x: Row(**x)).toDF().show()

Tags: falsetruemap字典is情况thistesting
1条回答
网友
1楼 · 发布于 2024-04-24 14:59:27

我想没有现成的解决办法。你知道吗

乍一看,我要做的是创建一个包含集合中所有列的set()列表,然后遍历每一行以创建所有不存在的列,并将它们初始化为None

list1 = [{'this':'bah', 'is': 'bah'}, 
         {'this': 'true', 'is': 'false'}, 
         {'this': 'true', 'is': 'false', 'testing':'bah'}]

# create a list of unique available keys   
keys = set().union(*(item.keys() for item in list1))

for key,item in enumerate(list1):
    # find which ones are not in the current row
    difference = [i for i in keys if i not in item]
    if len(difference) > 0:
        # create them
        for i in range(0,len(difference)):
            item[difference[i]] = None

然后您的集合具有相同的列数:

[{'this': 'bah', 'is': 'bah', 'testing': None}, {'this': 'true', 'is': 'false', 'testing': None}, {'this': 'true', 'is': 'false', 'testing': 'bah'}]

相关问题 更多 >