如何在spark sql substring中使用列值作为分隔符?

时间:2017-07-22 19:23:41

标签: scala dataframe apache-spark-sql

我正在尝试对另一列作为分隔符的列执行子字符串选项,像substring_index()这样的方法需要字符串值,有人可以建议吗?

2 个答案:

答案 0 :(得分:1)

substring_index将其定义为substring_index(Column str, String delim, int count)

因此,如果您在该列的所有字符串中都有一个公共分隔符

+-------------+----+
|col1         |col2|
+-------------+----+
|a,b,c        |,   |
|d,e,f        |,   |
|Jonh,is,going|,   |
+-------------+----+

您可以将此功能用作

import org.apache.spark.sql.functions._
df.withColumn("splitted", substring_index(col("col1"), ",", 1))

哪个应该给出结果

+-------------+----+--------+
|col1         |col2|splitted|
+-------------+----+--------+
|a,b,c        |,   |a       |
|d,e,f        |,   |d       |
|Jonh,is,going|,   |Jonh    |
+-------------+----+--------+

不同行上的不同拆分分隔符

如果在不同的行上有不同的拆分分隔符

+-------------+----+
|col1         |col2|
+-------------+----+
|a,b,c        |,   |
|d$e$f        |$   |
|jonh|is|going||   |
+-------------+----+

您可以将udf function定义为

import org.apache.spark.sql.functions._
def subStringIndex = udf((string: String, delimiter: String) => string.substring(0, string.indexOf(delimiter)))

并使用.withColumn api将其称为

df.withColumn("splitted", subStringIndex(col("col1"), col("col2")))

最终输出是

+-------------+----+--------+
|col1         |col2|splitted|
+-------------+----+--------+
|a,b,c        |,   |a       |
|d$e$f        |$   |d       |
|jonh|is|going||   |jonh    |
+-------------+----+--------+

我希望答案很有帮助

答案 1 :(得分:0)

您可以尝试使用两个不同的列作为参数调用相关的配置单元UDF。