检查电子邮件列是否包含@和。使用pyspark

检查电子邮件列是否包含@和。使用pyspark,pyspark,pyspark-sql,pyspark-dataframes,Pyspark,Pyspark Sql,Pyspark Dataframes,我有一个包含8M数据的数据框。有一个列名EMAIL包含我必须检查的电子邮件地址: 电子邮件值的格式必须为@.\u 电子邮件值只能包含字母数字字符和-\u@. 事实上,有一个Python库专门为它设计,validate\u email 您可以使用下面的代码段来验证电子邮件id from validate_email import validate_email from pyspark.sql.types import BooleanType from pyspark.sql.functions i

我有一个包含8M数据的数据框。有一个列名
EMAIL
包含我必须检查的电子邮件地址:

  • 电子邮件值的格式必须为
    @.\u
  • 电子邮件值只能包含字母数字字符和
    -\u@.

  • 事实上,有一个Python库专门为它设计,
    validate\u email


    您可以使用下面的代码段来验证电子邮件id

    from validate_email import validate_email
    from pyspark.sql.types import BooleanType
    from pyspark.sql.functions import udf
    
    valid_email = udf(lambda x: validate_email(x), BooleanType())
    
    emailvalidation.withColumn('is_valid', valid_email('EmailAddress')).show()
    
    +--------------------+--------+
    |               email|is_valid|
    +--------------------+--------+
    |aswin.raja@gm.com   |    true|
    |                abc |   false|
    +--------------------+--------+
    
    另一种方法是使用正则表达式。您可以使用下面的代码段

    import re 
    
    regex = '^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$'
    
    def check(email):  
    
        if(re.search(regex,email)):  
            print("Valid Email")  
        else:  
            print("Invalid Email")  
    
    
    if __name__ == '__main__' :  
    
        email = "aswin.raja@gm.com"
        check(email) 
        email = "aswinraja.com"
        check(email) 
    
    
    +--------+
    |Valid   |  
    |Invalid | 
    +--------+
    

    您可以使用以下代码验证表中的电子邮件Id

    from pyspark.sql.functions import udf
    from pyspark.sql.types import BooleanType
    import re 
    
    def regex_search(string):
        regex = '^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$'
        if re.search(regex, string, re.IGNORECASE):
          return True
        return False 
    
    validateEmail_udf = udf(regex_search, BooleanType())
    df = df.withColumn("is_valid",validateEmail_udf(col("email")))
    

    此处无需自定义项,只需使用函数:

    # not really the regex to validate emails but this handles your requirement
    r = """^[\w\d-_\.]+\.[\w\d-_\.]+@[\w\d]+\.[\w\d]+$"""
    
    df.withColumn("flag", when(col("email").rlike(regex), lit("valid")).otherwise(lit("invalid")))\
      .show()
    
    给出:

    +---+-----+----+-----------------+-------+
    |ids|first|last|            email|   flag|
    +---+-----+----+-----------------+-------+
    |  1|   aa| zxc|aswin.raja@gm.com|  valid|
    |  2|   bb| asd|aswin.raja@gm.com|  valid|
    |  3|   cc| qwe| aswinraja@ad.com|invalid|
    |  4|   dd| qwe|aswin.raja@gm.com|  valid|
    |  5|   ee| qws| aswinraja@ad.com|invalid|
    +---+-----+----+-----------------+-------+
    

    要让完整的正则表达式验证电子邮件地址,请检查此

    嗨,它给了我一个错误“没有名为“验证电子邮件地址”的模块”,因为我尝试从验证电子邮件地址导入验证电子邮件地址@aamirmalik124,这是
    validate\u email
    ,您需要先安装模块。是否有其他方法可以做到这一点,因为我使用的是数据块,无法安装任何python库。@aamirmalik124您可以始终使用正则表达式来验证电子邮件ID。我将编辑我的答案。是的,请编辑。代码运行正常,但当我显示结果数据帧时,其显示错误“作业因阶段失败而中止:阶段357.0中的任务5失败4次,最近的失败:阶段357.0中的任务5.3丢失(TID 16904,10.139.64.4,executor 29):org.apache.spark.api.python.python异常:回溯(最近一次呼叫最后):“你能帮我吗?你能添加正则表达式来验证电子邮件吗。