我有一个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函数。之后,剩下的就是简单地使用另一个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/

10-16 00:55