如何在 Databricks 中使用 Python 将数据框数组拆分为列
Posted
技术标签:
【中文标题】如何在 Databricks 中使用 Python 将数据框数组拆分为列【英文标题】:How to split a dataframe array into columns using Python in Databricks 【发布时间】:2021-12-24 19:32:14 【问题描述】:我是 databricks 的新手,我在 Python 中使用 databricks,我创建了一个 json 文件的架构,结果数据框 (display(result)) 给出了以下结果:
docs
-------
[
"id": 1,
"name": "product 1",
"brand": "new 1",
"val": [
"value": "test 1"
,
"value": "test 2"
,
"value": "test 3"
,
"value": "test 1"
]
,
"id": 2,
"name": "product 2",
"brand": "new 2",
"val": [
"value": "test 1"
,
"value": "test 2"
,
"value": "test 3"
,
"value": "test 1"
]
,
"id": 3,
"name": "product 3",
"brand": "new 3",
"val": [
"value": "test 1"
,
"value": "test 2"
,
"value": "test 3"
,
"value": "test 1"
]
]
而我正在寻找的是如何将这些数据放在单独的列中,例如:
id name brand val
1. product 1 new 1. ["value":"test 1",...]
2. product 2. .... ....
等等.. 请问有没有办法在databricks中使用python来做到这一点?
【问题讨论】:
可以分享result
数据框的架构吗?
【参考方案1】:
假设您的 result
数据框具有以下架构
root
|-- docs: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- id: integer (nullable = true)
| | |-- name: string (nullable = true)
| | |-- brand: string (nullable = true)
| | |-- val: array (nullable = true)
| | | |-- element: struct (containsNull = true)
| | | | |-- value: string (nullable = true)
您可以使用explode
将arrays
拆分为行并将包含的struct
展平为列。
from pyspark.sql import functions as F
data = """"docs": ['id': 1,
'name': 'product 1',
'brand': 'new 1',
'val': ['value': 'test 1',
'value': 'test 2',
'value': 'test 3',
'value': 'test 1'],
'id': 2,
'name': 'product 2',
'brand': 'new 2',
'val': ['value': 'test 1',
'value': 'test 2',
'value': 'test 3',
'value': 'test 1'],
'id': 3,
'name': 'product 3',
'brand': 'new 3',
'val': ['value': 'test 1',
'value': 'test 2',
'value': 'test 3',
'value': 'test 1']]"""
rdd = spark.sparkContext.parallelize([data, ])
df = spark.read.option("enforceSchema", "true").json(rdd, "docs ARRAY<STRUCT<id: INT, name STRING, brand: STRING, val: ARRAY<STRUCT<value: STRING>>>>")
df.select(F.explode("docs").alias("doc")).select("doc.*").show(truncate=False)
输出
+---+---------+-----+----------------------------------------+
|id |name |brand|val |
+---+---------+-----+----------------------------------------+
|1 |product 1|new 1|[test 1, test 2, test 3, test 1]|
|2 |product 2|new 2|[test 1, test 2, test 3, test 1]|
|3 |product 3|new 3|[test 1, test 2, test 3, test 1]|
+---+---------+-----+----------------------------------------+
【讨论】:
以上是关于如何在 Databricks 中使用 Python 将数据框数组拆分为列的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python / Pyspark 在 Databricks 笔记本中合并数据帧
如何在 python 中比较 Databricks 笔记本中的两个模式
如何在 Databricks 笔记本的 Python 单元中使 DataFrame 可见?
如何在 Databricks 的 PySpark 中使用在 Scala 中创建的 DataFrame
如何在 databricks 工作区中使用 python 获取 azure datalake 存储中存在的每个文件的最后修改时间?