我有一个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'})]
Run Code Online (Sandbox Code Playgroud)
我想重塑它在pyspark这样所有的按键(foo,bar,等)都列,分别为:
[Row(foo='1', bar='2', baz='aaa')]
Run Code Online (Sandbox Code Playgroud)
使用withColumn作品:
(df
.withColumn('foo', df.Parameters['foo'])
.withColumn('bar', df.Parameters['bar'])
.withColumn('baz', df.Parameters['baz'])
.drop('Parameters')
).collect()
Run Code Online (Sandbox Code Playgroud)
但我需要一个没有明确提到列名的解决方案,因为我有几十个.
>>> df.printSchema()
root
|-- Parameters: map (nullable = true)
| |-- key: string
| |-- value: string (valueContainsNull …Run Code Online (Sandbox Code Playgroud) 数据看起来像这样 -
+-----------+-----------+-----------------------------+
| id| point| data|
+-----------------------------------------------------+
| abc| 6|{"key1":"124", "key2": "345"}|
| dfl| 7|{"key1":"777", "key2": "888"}|
| 4bd| 6|{"key1":"111", "key2": "788"}|
Run Code Online (Sandbox Code Playgroud)
我试图将其分解为以下格式.
+-----------+-----------+-----------+-----------+
| id| point| key1| key2|
+------------------------------------------------
| abc| 6| 124| 345|
| dfl| 7| 777| 888|
| 4bd| 6| 111| 788|
Run Code Online (Sandbox Code Playgroud)
该explode函数将数据框分解为多行.但这不是理想的解决方案.
注意:此解决方案不能回答我的问题. PySpark在列中"爆炸"字典