将列表转换为pyspark中的数据框列

Posted

技术标签:

【中文标题】将列表转换为pyspark中的数据框列【英文标题】:Convert list to a dataframe column in pyspark 【发布时间】:2019-10-21 02:15:52 【问题描述】:

我有一个数据框,其中一个字符串类型列包含我想要分解并使其成为父数据框一部分的项目列表。我该怎么做?

这是创建示例数据框的代码:

from pyspark.sql import Row
from collections import OrderedDict

def convert_to_row(d: dict) -> Row:
    return Row(**OrderedDict(sorted(d.items())))

df=sc.parallelize(["arg1": "first", "arg2": "John", "arg3" : '["name" : "click", "datetime" : "1570103345039", "event" : "entry" , "name" : "drag", "datetime" : "1580133345039", "event" : "exit" ]',"arg1": "second", "arg2": "Joe", "arg3": '["name" : "click", "datetime" : "1670105345039", "event" : "entry" , "name" : "drop", "datetime" : "1750134345039", "event" : "exit" ]',"arg1": "third", "arg2": "Jane", "arg3" : '["name" : "click", "datetime" : "1580105245039", "event" : "entry" , "name" : "drop", "datetime" : "1650134345039", "event" : "exit" ]']) \
    .map(convert_to_row).toDF()

运行此代码将创建如下所示的数据框:

+------+----+--------------------+
|  arg1|arg2|                arg3|
+------+----+--------------------+
| first|John|["name" : "click...|
|second| Joe|["name" : "click...|
| third|Jane|["name" : "click...|
+------+----+--------------------+

arg3 列包含一个列表,我想将其分解为详细列。我想要的数据框如下:

arg1 | arg2 | arg3 |姓名 |日期时间 |事件

我怎样才能做到这一点?

【问题讨论】:

Pyspark: explode json in column to multiple columns 可能重复。 不完全一样。一个区别是我要扩展的第三列,它是一个项目列表。我想爆炸,以便它返回多行中的项目。然后我可以申请 from_json,如您提供的链接所示。我想知道如何将项目列表分成多行。 【参考方案1】:

您需要在from_json 函数中为模式指定数组:

from pyspark.sql.functions import explode, from_json

schema = 'array<struct<name:string,datetime:string,event:string>>'

df.withColumn('data', explode(from_json('arg3', schema))) \
  .select(*df.columns, 'data.*') \
  .show()                     
+------+----+--------------------+-----+-------------+-----+
|  arg1|arg2|                arg3| name|     datetime|event|
+------+----+--------------------+-----+-------------+-----+
| first|John|["name" : "click...|click|1570103345039|entry|
| first|John|["name" : "click...| drag|1580133345039| exit|
|second| Joe|["name" : "click...|click|1670105345039|entry|
|second| Joe|["name" : "click...| drop|1750134345039| exit|
| third|Jane|["name" : "click...|click|1580105245039|entry|
| third|Jane|["name" : "click...| drop|1650134345039| exit|
+------+----+--------------------+-----+-------------+-----+

注意:如果您的 Spark 版本不支持架构的 simpleString 格式,请尝试以下操作:

from pyspark.sql.types import ArrayType, StringType, StructType, StructField

schema = ArrayType(
    StructType([
          StructField('name',StringType())
        , StructField('datetime',StringType())
        , StructField('event',StringType())
    ])
)

【讨论】:

以上是关于将列表转换为pyspark中的数据框列的主要内容,如果未能解决你的问题,请参考以下文章

将多个火花数据框列转换为具有列表类型的单列

数据类型转换火花数据框列 - pyspark

pySpark - 在插入数据库之前将整个数据框列转换为 JSON 对象

将 Pyspark 数据框转换为具有实际值的列表

在 Pyspark 中列出保存顺序的数据框列

如何更改pyspark中的列元数据?