如何在 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)

您可以使用explodearrays 拆分为行并将包含的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 存储中存在的每个文件的最后修改时间?

使用 Python/Scala 的 Databricks 雪花表