Apache spark SparkSQL在字符串第一次出现时拆分字符串

Apache spark SparkSQL在字符串第一次出现时拆分字符串,apache-spark,apache-spark-sql,user-defined-functions,Apache Spark,Apache Spark Sql,User Defined Functions,我在spark数据框中有一个名为field的字符串列,如下所示: 我的字段名称:abc_def_ghi 我想去掉my_field\u name部分,只留下值。通常我会使用udf和子字符串函数,但我想知道是否有一种方法可以使用SparkSQL函数来实现这一点,这样我就不会在序列化udf时产生额外的SerDe。以下是我的尝试: .withColumn("fieldVals", split(substring($"field", instr($"field", "?"), len($"field"))

我在spark数据框中有一个名为
field
的字符串列,如下所示:

我的字段名称:abc_def_ghi

我想去掉
my_field\u name
部分,只留下值。通常我会使用udf和子字符串函数,但我想知道是否有一种方法可以使用SparkSQL函数来实现这一点,这样我就不会在序列化udf时产生额外的SerDe。以下是我的尝试:

.withColumn("fieldVals", split(substring($"field", instr($"field", "?"), len($"field")), ""))

问题是
split
需要一个
Int
,而我给它一个
Int
。有没有办法解决这个问题?

使用
regexp\u extract

val df=Seq(“我的字段”名称:abc_def_ghi”).toDF(“字段”)
df.select(regexp_extract($“field”,“:(.*),1)作为“col”).show()
输出:

+-----------+
|        col|
+-----------+
|abc_def_ghi|
+-----------+
或者使用
子字符串索引

df.select(子字符串索引($“field”,“:”,-1)作为“col”).show()
拆分

df.select(拆分($“字段”,“:”).getItem(1)为“列”).show()

使用
regexp\u extract

val df=Seq(“我的字段”名称:abc_def_ghi”).toDF(“字段”)
df.select(regexp_extract($“field”,“:(.*),1)作为“col”).show()
输出:

+-----------+
|        col|
+-----------+
|abc_def_ghi|
+-----------+
或者使用
子字符串索引

df.select(子字符串索引($“field”,“:”,-1)作为“col”).show()
拆分

df.select(拆分($“字段”,“:”).getItem(1)为“列”).show()

哦,太酷了!这可以一次提取多个片段吗?假设我想按
分割结果,那么将有3列
abc
def
ghi
,这可能是最容易处理
split
Seq(“abc\u def\u ghi”).toDF(“字段”)。选择(分割($”字段“,”作为“tmp”)。选择($”tmp.getItem(0),$”tmp.getItem(1),$”tmp.getItem(2))
。如果您需要更复杂的逻辑,正则表达式也可以工作哦,酷!这可以一次提取多个片段吗?假设我想按
分割结果,那么将有3列
abc
def
ghi
,这可能是最容易处理
split
Seq(“abc\u def\u ghi”).toDF(“字段”)。选择(分割($”字段“,”作为“tmp”)。选择($”tmp.getItem(0),$”tmp.getItem(1),$”tmp.getItem(2))
。如果需要更复杂的逻辑,正则表达式也可以工作