Spark列rlike将int转换为boolean

时间:2017-07-25 16:34:37

标签: regex scala apache-spark spark-dataframe

所以我使用正则表达式与Spark的列rlike从字符串中提取最后一位数字。问题是,在提取数字后,它会自动转换为布尔值。有没有办法阻止它自动转换为布尔值?

test.withColumn("Quarter", $"Month".rlike("\\d+$")) 

例如:

输入:

2015 Q 1
2015 Q 1
2015 Q 2
2015 Q 2

输出:

true
true
true
true

预期:1 1 2 2

我尝试将其转换为整数,但它只是返回1,因为它从Boolean转换为Int。

test.withColumn("Quarter", $"Month".rlike("\\d+$").cast("integer"))

2 个答案:

答案 0 :(得分:0)

Spark具有通过匹配正则表达式提取的功能,您可以使用regexp_extract函数。

scala> val df = Seq("2015 Q 1", "2015 Q 1", "2015 Q 2", "2015 Q 2").toDF("col1") 
df: org.apache.spark.sql.DataFrame = [col1: string]

scala> import org.apache.spark.sql.functions._
import org.apache.spark.sql.functions._

scala> df.withColumn("Quarter",regexp_extract($"col1", ".*(\\d+)$", 1)).show

+--------+-------+
|    col1|Quarter|
+--------+-------+
|2015 Q 1|      1|
|2015 Q 1|      1|
|2015 Q 2|      2|
|2015 Q 2|      2|
+--------+-------+

答案 1 :(得分:0)

这是预期的行为,rlike用于过滤。从regex_extract

尝试org.apache.spark.sql.functions
df.withColumn("Q", regexp_extract($"month", ".*(\\d)$", 1))
在你的情况下,

甚至来自同一个包的子串就足够了:

df.withColumn("Q", substring($"month",7,7))

可以将这些列转换为您希望的整数(尽管解析而不是转换...)