为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米脂 2022-08-11 17:39:27
如果我有一个字典列表,看起来像这样: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”。实际上,此列表中将有两个以上的字典,并且无法保证字典之间的键是否相同,因此找到一种可靠的方法来处理可能不同的键非常重要。
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

您可以传递字典以创建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 deprecated

df.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 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)))


查看完整回答
反对 回复 2022-08-11
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信