数据是这样的-
+-----------+-----------+-----------------------------+
| id| point| data|
+-----------------------------------------------------+
| abc| 6|{"key1":"124", "key2": "345"}|
| dfl| 7|{"key1":"777", "key2": "888"}|
| 4bd| 6|{"key1":"111", "key2": "788"}|
字符串
我试着把它转换成下面的格式。
+-----------+-----------+-----------+-----------+
| id| point| key1| key2|
+------------------------------------------------
| abc| 6| 124| 345|
| dfl| 7| 777| 888|
| 4bd| 6| 111| 788|
型explode
函数将 Dataframe 分解为多行。但这不是理想的解决方案。
注意:这个解决方案没有回答我的问题。PySpark "explode" dict in column
6条答案
按热度按时间wj8zmpe11#
只要您使用的是Spark 2.1或更高版本,
pyspark.sql.functions.from_json
就应该能得到您想要的结果,但您需要首先定义所需的schema
字符串
这样你就能
型
3df52oht2#
正如@pault所建议的,数据字段是
string
字段。由于密钥是相同的(即,'key 1','key 2'),也可以使用json_tuple()
(根据文档,此函数是1.6版本的新增功能)字符串
下面是我的原始帖子:如果原始表来自
df.show(truncate=False)
,那么data
字段不是python数据结构,那么这很可能是错误的。因为你已经将数据分解成行,所以我假设列
data
是一个Python数据结构而不是字符串:型
fruv7luv3#
正如@jxc所提到的,如果您无法预先定义模式,并且您只需要处理单一级别的json字符串,那么
json_tuple
应该可以正常工作。我认为它更直接,更容易使用。奇怪的是,我没有发现其他人提到这个功能之前。在我的用例中,原始数据框模式:
StructType(List(StructField(a,StringType,true)))
,json字符串列显示为:字符串
使用
json_tuple
将json字段扩展为新列:型
文档中没有详细说明,但至少在我的用例中,
json_tuple
提取的新列是StringType
,并且它只提取单一深度的JSON字符串。型
31moq8wy4#
这适用于我的用例
字符串
20jt8wwn5#
作者:Shrikant Prabhu
您可以简单地使用SQL
字符串
像这样,如果数据发生变化,新表的模式将自适应,并且您不必在管道中做任何事情。
8gsdolmq6#
在这种方法中,您只需要设置包含Json内容的列的名称。无需设置模式。一切都是自动的。
字符串