Apache spark Spark:从失败的regexp_extract()返回null

Apache spark Spark:从失败的regexp_extract()返回null,apache-spark,pyspark,spark-dataframe,Apache Spark,Pyspark,Spark Dataframe,假设您尝试从数据帧的列中提取子字符串regexp_extract()如果字段本身为空,则返回空字符串;如果字段不为空,但未找到表达式,则返回空字符串。对于后一种情况,如何返回空值 df = spark.createDataFrame([(None),('foo'),('foo_bar')], StringType()) df.select(regexp_extract('value', r'_(.+)', 1).alias('extracted')).show() # +---------+

假设您尝试从数据帧的列中提取子字符串
regexp_extract()
如果字段本身为空,则返回空字符串;如果字段不为空,但未找到表达式,则返回空字符串。对于后一种情况,如何返回空值

df = spark.createDataFrame([(None),('foo'),('foo_bar')], StringType())
df.select(regexp_extract('value', r'_(.+)', 1).alias('extracted')).show()

# +---------+
# |extracted|
# +---------+
# |     null|
# |         |
# |      bar|
# +---------+

我不确定
regexp\u extract()
是否可以为字符串类型返回
None
。可以使用用户定义的函数将空字符串替换为
None

from pyspark.sql.functions import regexp_extract, udf
from pyspark.sql.types import StringType

df = spark.createDataFrame([(None),('foo'),('foo_bar')], StringType())
toNoneUDF = udf(lambda val: None if val == "" else val, StringType())
new_df = df.select(regexp_extract('value', r'_(.+)', 1).alias('extracted'))
new_df.withColumn("extracted", toNoneUDF(new_df.extracted)).show()
这应该起作用:

df = spark.createDataFrame([(None),('foo'),('foo_bar')], StringType())
df = df.select(regexp_extract('value', r'_(.+)', 1).alias('extracted'))
df.withColumn(
    'extracted',
    when(col('extracted') != '', col('extracted'), lit(None))
).show()

在spark SQL中,我找到了一个解决方案,可以忽略空值来计算正则表达式出现的次数:

SELECT COUNT(CASE WHEN rlike(col, "_(.+)") THEN 1 END)
FROM VALUES (NULL), ("foo"), ("foo_bar"), ("") AS tab(col);
结果:

1

我希望这将对你们中的一些人有所帮助。

我一直在使用基于zero323答案的类似方法。是否最好像上面那样使用udf?