gpt4 book ai didi

python - 将列中的 String 转换为 ArrayType 并分解

转载 作者:行者123 更新时间:2023-12-01 02:08:08 26 4
gpt4 key购买 nike

我有一个 PySpark 数据框,其中一列是字符串类型,而字符串是一个 2D 数组/列表,需要分解为行。但是,由于它不是结构/数组类型,因此无法直接使用explode

这可以在下面的示例中看到:

a = [('Bob', 562,"Food", "[[29,June,2018],[12,May,2018]]"), ('Bob',880,"Food","[[01,June,2018]]"), ('Bob',380,'Household',"[[16,June,2018]]")]
df = spark.createDataFrame(a, ["Person", "Amount","Budget", "Date"])

df.printSchema()

输出:

root
|-- Person: string (nullable = true)
|-- Amount: long (nullable = true)
|-- Budget: string (nullable = true)
|-- Date: string (nullable = true)

我正在寻找的输出如下所示。我需要能够将字符串转换为结构/数组,以便我可以爆炸:

+------+------+---------+---+-----+-----+
|Person|Amount|Budget |Day|Month|Year |
+------+------+---------+---+-----+-----+
|Bob |562 |Food |29 |June |2018 |
|Bob |562 |Food |12 |May |2018 |
|Bob |880 |Food |01 |June |2018 |
|Bob |380 |Household|16 |June |2018 |
+------+------+---------+---+-----+-----+

最佳答案

首先删除外部的 [[]] 并将字符串拆分为所有 ],[。分割后的数据将位于一个数组中,从而可以使用 explode 函数。之后,剩下的就是使用另一个 splitgetItem 将数据格式化为所需的输出。

可以按如下方式完成:

from pyspark.sql import functions as F

df.withColumn('date_arr', F.split(F.regexp_replace('Date', '\[\[|\]\]', ''), ','))\
.withColumn('date_arr', F.explode('date_arr'))\
.withColumn('date_arr', F.split('date_arr', ','))\
.select('Person',
'Amount',
'Budget',
'date_arr'.getItem(0).alias('Day'),
'date_arr'.getItem(0).alias('Month'),
'date_arr'.getItem(0).alias('Year'))

关于python - 将列中的 String 转换为 ArrayType 并分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48864173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com