所以我使用正则表达式与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"))
答案 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))
可以将这些列转换为您希望的整数(尽管解析而不是转换...)