当Python字典具有不同的键时,将它们组合到Spark数据帧中
如果我有一个类似以下内容的词典列表:当Python字典具有不同的键时,将它们组合到Spark数据帧中,python,apache-spark,dictionary,pyspark,apache-spark-sql,Python,Apache Spark,Dictionary,Pyspark,Apache Spark Sql,如果我有一个类似以下内容的词典列表: list = [{'a': 1, 'b': 2, 'c': 3}, {'b': 4, 'c': 5, 'd': 6, 'e': 7}] 如何将列表转换为Spark数据帧,而不删除字典之间可能不共享的任何键?例如,如果我使用sc.parallelize(list).toDF(),则生成的数据帧将包含列“a”、“b”和“c”,其中第二个字典的列“a”为空,第二个字典的列“d”和“e”将被完全删除 通过对字典顺序的研究,我发现它遵从于列表中首先出现的字典中的键,
list = [{'a': 1, 'b': 2, 'c': 3}, {'b': 4, 'c': 5, 'd': 6, 'e': 7}]
如何将列表转换为Spark数据帧,而不删除字典之间可能不共享的任何键?例如,如果我使用sc.parallelize(list).toDF(),则生成的数据帧将包含列“a”、“b”和“c”,其中第二个字典的列“a”为空,第二个字典的列“d”和“e”将被完全删除
通过对字典顺序的研究,我发现它遵从于列表中首先出现的字典中的键,因此,如果我在上面的示例中交换字典,则生成的数据帧将具有列“b”、“c”、“d”和“e”
事实上,这个列表中有两个以上的字典,并且不能保证每个字典的键都是相同的,所以我找到一种可靠的方法来处理可能不同的键是很重要的 您可以将字典传递给函数
l = [{'a': 1, 'b': 2, 'c': 3}, {'b': 4, 'c': 5, 'd': 6, 'e': 7}]
df = spark.createDataFrame(l)
#UserWarning: inferring schema from dict is deprecated,please use pyspark.sql.Row instead
#warnings.warn("inferring schema from dict is deprecated
df.show()
+----+---+---+----+----+
| a| b| c| d| e|
+----+---+---+----+----+
| 1| 2| 3|null|null|
|null| 4| 5| 6| 7|
+----+---+---+----+----+
还为列提供schema
,因为不推荐使用字典的模式推断。使用行
对象创建数据框需要所有字典具有相同的列
通过合并所有相关字典中的键以编程方式定义架构
from pyspark.sql.types import StructType,StructField,IntegerType
#Function to merge keys from several dicts
def merge_keys(*dict_args):
result = set()
for dict_arg in dict_args:
for key in dict_arg.keys():
result.add(key)
return sorted(list(result))
#Generate schema given a column list
def generate_schema(columns):
result = StructType()
for column in columns:
result.add(column,IntegerType(),nullable=True) #change type and nullability as needed
return result
df = spark.createDataFrame(l,schema=generate_schema(merge_keys(*l)))
输出数据帧应该是什么样子?在我上面的示例中,对应于第一个字典的行对于列“d”和“e”应该有null/na值,对应于第二个字典的行对于列“a”应该有null/na值。所有其他键都是共享的,因此它们应该基于键显示在相应的列中。这是否回答了您的问题?我认为这是上述内容的完全复制品。不完全是。我之前遇到过上述问题,但它建议使用sc.parallelize,当字典大小不同时,它不会返回所需的数据帧。@Vamsi Prabhala,我有一个简单得多的问题,但逻辑类似。提前谢谢!