我有一个Spark (1.4) dataframe,其中列中的数据类似于"1-2-3-4-5-6-7-8-9-10-11-12“。我想将数据拆分为多个列。请注意,字段的数量可以从1到12个不同,这是不固定的。另外,我们使用的是Scala API。
编辑:
对原始问题进行编辑。我有如下分隔字符串:
"ABC-DEF-PQR-XYZ"
根据这个字符串,我需要在单独的列中创建分隔字符串,如下所示。请注意,此字符串位于DF中的列中。
Original column: ABC-DEF-PQR-XYZ
New col1 : ABC
New col2 : ABC-DEF
New col3 : ABC-DEF-PQR
New col4 : ABC-DEF-PQR-XYZ
请注意,可能有12个这样的新列需要从原始字段派生。此外,原始列中的字符串可能会发生变化,例如,有时是1列,有时是2,但max可以是12。希望我已经清楚地表达了问题的陈述。
谢谢!
发布于 2018-05-15 20:52:47
您可以使用explode
和pivot
。以下是一些示例数据:
df=sc.parallelize([["1-2-3-4-5-6-7-8-9-10-11-12"], ["1-2-3-4"], ["1-2-3-4-5-6-7-8-9-10"]]).toDF(schema=["col"])
现在为行添加一个唯一的id,这样我们就可以跟踪数据属于哪一行:
df=df.withColumn("id", f.monotonically_increasing_id())
然后通过分隔符-
拆分列,然后拆分得到一个长格式数据集:
df=df.withColumn("col_split", f.explode(f.split("col", "\-")))
最后,将重点放在id
上,以获得更广泛的形式:
df.groupby("id")
.pivot("col_split")
.agg(f.max("col_split"))
.drop("id").show()
https://stackoverflow.com/questions/50349036
复制相似问题