输入
我有一个列 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 中重塑它,以便所有键( foo
, bar
等)都变成列,即:
[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()
但 我需要一个没有明确提及列名的解决方案,因为我有几十个。
原文由 Kamil Sindi 发布,翻译遵循 CC BY-SA 4.0 许可协议
由于
MapType
的键不是模式的一部分,您必须首先收集这些键,例如:当你拥有这些时,剩下的就是简单的选择: