假设您尝试从数据帧的列中提取子字符串。如果字段本身为null,则regexp_extract()
返回null,但如果field不为null但未找到表达式,则返回空字符串。如何为后一种情况返回空值?
df = spark.createDataFrame([(None),('foo'),('foo_bar')], StringType())
df.select(regexp_extract('value', r'_(.+)', 1).alias('extracted')).show()
# +---------+
# |extracted|
# +---------+
# | null|
# | |
# | bar|
# +---------+
答案 0 :(得分:0)
我不确定regexp_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()
答案 1 :(得分:0)
这应该有效:
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()
答案 2 :(得分:0)
在 spark SQL 中,我找到了一个解决方案来计算正则表达式出现的次数,忽略空值:
SELECT COUNT(CASE WHEN rlike(col, "_(.+)") THEN 1 END)
FROM VALUES (NULL), ("foo"), ("foo_bar"), ("") AS tab(col);
结果:
1
我希望这对你们中的一些人有所帮助。