2017-02-10 90 views
0

假設您嘗試從數據框的列中提取子字符串。 regexp_extract()如果字段本身爲空則返回null,但如果字段不爲null但未找到該表達式,則返回空字符串。如何爲後一種情況返回空值?Spark:從失敗的regexp_extract()返回null

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

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

回答

0

我不知道,如果regexp_extract()所能返回None爲String類型。有一兩件事你可以做的是使用用戶定義的函數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() 
+0

我一直在使用基於zero323的回答[這裏](類似的方法http://stackoverflow.com/questions/33287886/更換空弦與 - 沒有無效值 - 在非數據幀)。像上面所做的那樣,最好使用udf嗎? – evilpilotfish

相關問題