【发布时间】:2018-04-08 20:42:50
【问题描述】:
我将 Spark 数据框列(字符串列)拆分为多个列,如下所示:
val dfSplitted = df.withColumn("splc", split(col("c_001"), "\\[|\\[.*?\\]\\|(^;\\])")).select(col("*") +: (0 until 12).map(i => col("splc").getItem(i).as(s"spl_c$i")): _*).drop("splc","c_001")
这里的字符串列(c_001)的结构类似于下面。
Str|[ts1:tssub2|ts1:tssub2]|BLANK|[INT1|X.X.X.X|INT2|BLANK |BLANK | |X.X.X.X|[INT3|s1]]|[INT3|INT4|INT5|INT6|INT7|INT8|INT9|INT10|INT11|INT12|INT13|INT14|INT15]|BLANK |BLANK |[s2|s3|s4|INT16|INT17];[s5|s6|s7|INT18|INT19]|[[s8|s9|s10|INT20|INT21]|ts3:tssub3| | ];[[s11|s12|s13|INT21|INT22]|INT23:INT24|BLANK |BLANK ]|BLANK |BLANK |[s14|s15]
我希望拆分列(spl_c0 到 spl_c11)像(表示为行)
Str
[ts1:tssub2|ts1:tssub2]
BLANK
[INT1|X.X.X.X|INT2|BLANK |BLANK | |X.X.X.X|[INT3|s1]]
[INT3|INT4|INT5|INT6|INT7|INT8|INT9|INT10|INT11|INT12|INT13|INT14|INT15]
BLANK
BLANK
[s2|s3|s4|INT16|INT17];[s5|s6|s7|INT18|INT19]
[[s8|s9|s10|INT20|INT21]|ts3:tssub3| | ];[[s11|s12|s13|INT21|INT22]|INT23:INT24|BLANK |BLANK ]
BLANK
BLANK
[s14|s15]
这里 spl_c7 : [s2|s3|s4|INT16|INT17];[s5|s6|s7|INT18|INT19] 可以有一个或多个重复,如 [s2|s3|s4|INT16|INT17] 具有不同的值。在这种情况下,以分号作为分隔符重复两次。
输出列(表示为行):
Str|
ts1:tssub2|ts1:tssub2]|BLANK|
INT1|X.X.X.X|INT2|BLANK |BLANK | |X.X.X.X|
INT3|s1]]|
INT3|INT4|INT5|INT6|INT7|INT8|INT9|INT10|INT11|INT12|INT13|INT14|INT15]|BLANK |BLANK |
s2|s3|s4|INT16|INT17];
s5|s6|s7|INT18|INT19]|
s8|s9|s10|INT20|INT21]|ts1:tssub2| | ];
s11|s12|s13|INT21|INT22]|INT23:INT24|BLANK |BLANK ]|BLANK |BLANK |
s14|s15]
我想知道为什么我的拆分不会给出预期的结果,是否还有另一种方法来解决这个问题(特别是考虑到性能)?
【问题讨论】:
-
您可以使用自定义
udf函数进行拆分。 stackoverflow.com/questions/40931278/…
标签: scala split spark-dataframe