猿问

当 Python 字典具有不同的键时,将 Python 字典合并到 Spark 数据帧中

如果我有一个字典列表,看起来像这样:

list = [{'a': 1, 'b': 2, 'c': 3}, {'b': 4, 'c': 5, 'd': 6, 'e': 7}]

如何将列表转换为 Spark 数据帧,而不会删除任何可能不在字典之间共享的键?例如,如果我使用 sc.parallelize(list).toDF(),则生成的数据帧将具有列 “a”、“b” 和 “c”,第二个字典的“a” 列为 null,第二个字典中的列 “d” 和 “e” 将被完全删除。

通过对字典顺序的调整,我看到它服从于列表中第一个出现的字典中的键,因此,如果我在上面的示例中交换字典,我生成的数据帧将具有列“b”,“c”,“d”和“e”。

实际上,此列表中将有两个以上的字典,并且无法保证字典之间的键是否相同,因此找到一种可靠的方法来处理可能不同的键非常重要。


米脂
浏览 130回答 1
1回答

海绵宝宝撒

您可以传递字典以创建DataFrame函数。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 deprecateddf.show()+----+---+---+----+----+|   a|  b|  c|   d|   e|+----+---+---+----+----+|   1|  2|  3|null|null||null|  4|  5|   6|   7|+----+---+---+----+----+此外,还为列提供,因为不推荐使用字典的架构推理。使用对象创建数据框要求所有字典具有相同的列。schemaRow通过合并涉及的所有字典中的键,以编程方式定义架构。from pyspark.sql.types import StructType,StructField,IntegerType#Function to merge keys from several dictsdef 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 listdef generate_schema(columns):    result = StructType()    for column in columns:        result.add(column,IntegerType(),nullable=True) #change type and nullability as needed    return resultdf = spark.createDataFrame(l,schema=generate_schema(merge_keys(*l)))
随时随地看视频慕课网APP

相关分类

Python
我要回答