【问题标题】:Spark Splitting a String column to new fixed number of columnsSpark将字符串列拆分为新的固定列数
【发布时间】: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]

我想知道为什么我的拆分不会给出预期的结果,是否还有另一种方法来解决这个问题(特别是考虑到性能)?

【问题讨论】:

标签: scala split spark-dataframe


【解决方案1】:

问题在于正则表达式本身。编写一个正则表达式来匹配所有标准似乎很难(至少对我自己而言)。因此,与其用正则表达式拆分字符串,不如发现使用函数拆分似乎是一种更好的方法。虽然遇到过很少的hiccups,但是在 StackOverFlow 社区的帮助下,能够想通了。

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    相关资源
    最近更新 更多