我有一个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)
我正在寻找的输出如下所示。我需要能够将String转换为Struct / Array,以便爆炸:
+------+------+---------+---+-----+-----+
|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
函数。之后,剩下的就是简单地使用另一个split
和getItem
将数据格式化为所需的输出。
可以按照以下步骤完成:
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/