【问题标题】:splitting of email-address in spark-sql在 spark-sql 中拆分电子邮件地址
【发布时间】:2021-10-17 17:55:57
【问题描述】:

代码:

length(neutral)>0 then regexp_extract(neutral, '(.*@)', 0) else '' end as中性的情况

上面的查询返回带有@符号的输出值,例如如果输入是1234@gmail.com,那么输出是1234@。如何使用上述查询删除 @ 符号。并且结果输出应该被评估为数字,如果它包含任何非数字字符,它应该被拒绝。

示例输入:1234@gmail.com 输出:1234 示例输入:123adc@gmail.com 输出:空

【问题讨论】:

    标签: sql database scala dataframe apache-spark


    【解决方案1】:

    您可以将正则表达式表述为^[^@]+,这将匹配电子邮件地址中的所有字符,但不包括@ 字符:

    REGEXP_EXTRACT(neutral, '^[^@]+', 0) AS neutral
    

    请注意,这种方法也很简洁,我们不必使用庞大的 CASE 表达式。

    【讨论】:

      【解决方案2】:

      试试这个代码:

      val pattern = """([0-9]+)@([a-zA-Z0-9]+.[a-z]+)""".r
      
      val correctEmail = "1234@gmail.com"
      
      val wrongEmail = "1234abcd@gmail.com"
      
      def parseEmail(email: String): Option[String] = 
        
        email match {
          case pattern(id, domain) => Some(id)
          case _ => None
        }
      
      
      println(parseEmail(correctEmail)) //  prints Some(1234)
      println(parseEmail(wrongEmail)) // prints None
      
      

      另外,使用Options 而不是null 更习惯用语

      【讨论】:

      • 模式 """([0-9]+)@([a-zA-Z0-9]+.[az]+)""" 适用于有效输入但无效输入它返回拆分值,如 678@gmail.com。如果条件失败,则输出应为 null。根据您的条件,示例输入:1234abc789@gmail.com,输出:789@gmail.com..如果它具有非数字值,则应返回 null。 @詹姆斯
      • 这里是查询......当长度(中性)>0然后regexp_extract(中性,'([0-9]+)@([a-zA-Z0-9 ]+.[az]+)',0) else '' 以中立结尾@james
      • @Vikram 正则表达式模式仅适用于 Scala。您的regexp_extract 似乎来自apache-spark。所以请在我为你写的spark之外使用它,没有regexp_extract函数。返回null 在编程中也是一种不好的做法。请改用None,然后使用.getOrElsegetmapforeach 函数来使用结果。
      • @Vikram 你可以在这里看到正在运行的code
      猜你喜欢
      • 2023-01-28
      • 1970-01-01
      • 2011-10-14
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2022-07-14
      • 1970-01-01
      相关资源
      最近更新 更多