Apache spark SparkSQL在字符串第一次出现时拆分字符串
我在spark数据框中有一个名为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"))
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))
。如果需要更复杂的逻辑,正则表达式也可以工作