gpt4 book ai didi

python - PySpark 将 'map' 类型的列转换为数据框中的多列

转载 作者:太空狗 更新时间:2023-10-29 18:25:04 59 4
gpt4 key购买 nike

输入

我有一列 Parameters 类型为 map 的形式:

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
d = [{'Parameters': {'foo': '1', 'bar': '2', 'baz': 'aaa'}}]
df = sqlContext.createDataFrame(d)

df.collect()
# [Row(Parameters={'foo': '1', 'bar': '2', 'baz': 'aaa'})]

df.printSchema()
# root
# |-- Parameters: map (nullable = true)
# | |-- key: string
# | |-- value: string (valueContainsNull = true)

输出

我想在 PySpark 中 reshape 它,以便所有键(foobar 等)都变成列,即:

[Row(foo='1', bar='2', baz='aaa')]

使用 withColumn 有效:

(df
.withColumn('foo', df.Parameters['foo'])
.withColumn('bar', df.Parameters['bar'])
.withColumn('baz', df.Parameters['baz'])
.drop('Parameters')
).collect()

但是我需要一个没有明确提及列名的解决方案,因为我有几十个列名。

最佳答案

由于 MapType 的键不是模式的一部分,您必须首先收集这些键,例如:

from pyspark.sql.functions import explode

keys = (df
.select(explode("Parameters"))
.select("key")
.distinct()
.rdd.flatMap(lambda x: x)
.collect())

当你有了这个之后,剩下的就是简单的选择:

from pyspark.sql.functions import col

exprs = [col("Parameters").getItem(k).alias(k) for k in keys]
df.select(*exprs)

关于python - PySpark 将 'map' 类型的列转换为数据框中的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36869134/

59 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com