使用 SparkR 替换列中的特殊字符

Replace special characters in a column using SparkR

我有一个包含一列的数据框。在本专栏中,我有如下所示的字符串

 <a href="mailto:NO@EMAIL.COM">NO@EMAIL.COM</a>
<a href="mailto:MICAHELBAHOU@YAHO">MICAHELSAM@YAHOO.COM</a>…

但我的专栏中只需要以下值

NO@EMAIL.COM
MICAHELSAM@YAHOO.COM

我尝试使用 substring_index,如下所示

df$EMAIL_ADDR <- SparkR::substring_index(df$EMAIL_ADDR, "<", -1)
df$EMAIL_ADDR <- SparkR::substring_index(df$EMAIL_ADDR, ">", 1)

但是列值没有改变。我也尝试了不同的 int 值。

非常感谢任何帮助

使用基本正则表达式:

df <- data.frame(email_addr=c(
    '<a href="mailto:NO@EMAIL.COM">NO@EMAIL.COM</a>',
    '<a href="mailto:MICAHELBAHOU@YAHO">MICAHELSAM@YAHOO.COM</a>'
))

sdf <- createDataFrame(sqlContext, df)

email <- alias(regexp_extract(sdf$email_addr, "(?<=\>)(.*)(?=\<)", 1), "email")

select(sdf, email) %>% head()
##                  email
## 1         NO@EMAIL.COM
## 2 MICAHELSAM@YAHOO.COM

withColumn(sdf, "email", email)
## DataFrame[email_addr:string, email:string]

使用 HiveContextXPath UDF:

hiveContext <- sparkRHive.init(sc)
hdf <- createDataFrame(hiveContext, df)

xpath_email <- alias(expr("xpath(email_addr, '/a/text()')"), "email")

select(hdf, xpath_email) %>% head()
##                  email
## 1         NO@EMAIL.COM
## 2 MICAHELSAM@YAHOO.COM


withColumn(hdf, "email", xpath_email)
## DataFrame[email_addr:string, email:array<string>]

请注意,XPath returns 是一个数组。如果你想要单独的元素,你可以 explode:

withColumn(hdf, "email", explode(xpath_email))

getItem:

withColumn(hdf, "email", getItem(xpath_email, 0L))