Pyspark:将具有不同键的rdd转换为spark dataframe
Pyspark: convert rdd with different keys to spark dataframe
我遇到的情况是我的 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()
我想没有开箱即用的解决方案。
乍一看,我要做的是创建一个包含我集合中所有列的 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'}]
我遇到的情况是我的 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()
我想没有开箱即用的解决方案。
乍一看,我要做的是创建一个包含我集合中所有列的 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'}]