【问题标题】:How to get the numeric characters from the Alphanumeric string in Spark-Sql如何从 Spark-Sql 中的字母数字字符串中获取数字字符
【发布时间】:2021-12-09 05:27:35
【问题描述】:
spark.sql("select case when length(date)>0  then regexp_extract(date,'\\\\d+', 0) else '' end as date from input").show(false)

上面的 spark 代码给出了数字字符的第一个实例的输出。

样本输入:1234avf456wef 样本输出:1234456

它应该显示字符串中的所有数字字符。提前致谢

【问题讨论】:

    标签: mysql dataframe apache-spark apache-spark-sql


    【解决方案1】:

    最好使用REG_REPLACE

    也许您需要熟练使用正则表达式来满足您的需求

    SELECT REGEXP_REPLACE('1234avf456wef ', '[a-zA-Z]', '');
    
    | REGEXP_REPLACE('1234avf456wef', '[a-zA-Z]', '') | | :------------------------------------------------------------ | | 1234456 |

    db小提琴here

    将不需要的特殊字符添加到 reg 字符串中

    SELECT REGEXP_REPLACE('1234avf456wef 5§$$§%&"%%', '[a-zA-Z "§$%&/]', '');
    
    | REGEXP_REPLACE('1234avf456wef 5§$$§%&"%%', '[a-zA-Z "§$%&/]', '') | | :------------------------------------------------ ------------------ | | 12344565 |

    db小提琴here

    因为你有一个字符串,所以使用字符串函数来切割 8 个 c 数字 otr 根据需要填充字符串

    SELECT LPAD(LEFT(REGEXP_REPLACE('1234avf456wef 5§$$§%&"%%', '[a-zA-Z "§$%&/]', ''),8),8,' ');
    
    | LPAD(LEFT(REGEXP_REPLACE('1234avf456wef 5§$$§%&"%%', '[a-zA-Z "§$%&/]', ''),8),8,' ') | | :------------------------------------------------ -------------------------------------------------- | | 12344565 |

    db小提琴here

    【讨论】:

    • 这很好用谢谢!但是如果字符串包含特殊字符和空格怎么办。在那种情况下,你能不能也改变这个查询..@nbk
    • 你可以看到修改后的答案
    • 行得通!谢谢,如果我需要另一个要求,如果我需要检查输出的长度应该正好是 8(即)如何检查 regexp_replace 语句中的长度。
    • 正则表达式没有那个,如果数字小于8填充怎么办?
    • 我添加了必要的字符串函数
    【解决方案2】:

    您可以尝试以下使用regexp_replace 删除所有非数字字符的修改。

    下面是一个工作示例,其中还包括从 '1234vf456wef &%' 中删除特殊字符

    spark.sql("with input as (select '1234vf456wef &%' as date union all select '123' union all select 'a very long 123 string with 456 content.') select date as original,case when length(date)>0  then regexp_replace(date,'[^0-9]', '') else '' end as date from input").show()
    

    输出

    +----------------------------------------+-------+
    |original                                |date   |
    +----------------------------------------+-------+
    |1234vf456wef &%                         |1234456|
    |123                                     |123    |
    |a very long 123 string with 456 content.|123456 |
    +----------------------------------------+-------+
    

    让我知道这是否适合你。

    【讨论】:

    • 这个查询给出了整个字符串......不是我们期望的数字字符
    • @Vikram 我已经用额外的样本和测试时收到的输出更新了答案。你能分享没有给你预期输出的样本和输出吗?
    • 现在可以正常使用了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多