【问题标题】:Spark SQL rlike to find all strings with trailing numbersSpark SQL 喜欢查找所有带有尾随数字的字符串
【发布时间】:2017-09-03 11:25:20
【问题描述】:

从数据框查询时,我尝试使用rlike,但没有取得多大成功。

样本数据:

column_a|column_b
1|abc xyz
2|123 abc xyz
3|abc 123 xyz
4|abc 123
5|xyz 123

预期输出:

column_a|column_b
4|abc 123
5|xyz 123

我试过了:

select * from table_1 where column_b rlike '\d+$' (select * from table_1 where column_b rlike '/\d+$')

输出(无结果):

column_a|column_b

我也试过了:

select * from table_1 where column_b rlike '\d*$' (select * from table_1 where column_b rlike '/\d*$')

输出(所有行):

column_a|column_b
1|abc xyz
2|123 abc xyz
3|abc 123 xyz
4|abc 123
5|xyz 123

我的正则表达式不正确吗?我已经使用 python 和在线测试器进行了测试,它看起来是正确的。或者rlike 是否支持某些特定的正则表达式?

【问题讨论】:

    标签: sql regex apache-spark apache-spark-sql pyspark-sql


    【解决方案1】:

    您需要更多的转义才能使其正常工作。特别是:

    spark.sql("SELECT 'abc 123' RLIKE '\\\\d+$'").show()
    
    +------------------+
    |abc 123 RLIKE \d+$|
    +------------------+
    |              true|
    +------------------+
    
    spark.sql("SELECT '123 abc xyz' RLIKE '\\\\d+$'").show()
    
    +----------------------+
    |123 abc xyz RLIKE \d+$|
    +----------------------+
    |                 false|
    +----------------------+
    

    【讨论】:

    • 这是什么鬼……你能解释一下为什么需要这么多转义吗?我的意思是它有效,但我想了解哪个层做什么:)
    • @LauriK 你叫这么多? this one 呢?问题是双重的——表达式是在 JVM 上评估的,所以如果你想直接在 Java 中调用它,你已经需要"\\d+$'。而且由于我们的字符串必须传递到另一侧,因此每个反冲也必须被转义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2017-05-17
    • 2020-08-24
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多