如何在PySpark中用NULL替换字符串值?

时间:2016-04-27 18:08:33

标签: apache-spark dataframe null pyspark

我想做这样的事情:

df.replace('empty-value', None, 'NAME')

基本上,我想用NULL替换一些值。但是在这个函数中它不接受None。我怎么能这样做?

4 个答案:

答案 0 :(得分:25)

您可以将when子句与NULL字面值和类型转换组合如下:

from pyspark.sql.functions import when, lit, col

df = sc.parallelize([(1, "foo"), (2, "bar")]).toDF(["x", "y"])

def replace(column, value):
    return when(column != value, column).otherwise(lit(None))

df.withColumn("y", replace(col("y"), "bar")).show()
## +---+----+
## |  x|   y|
## +---+----+
## |  1| foo|
## |  2|null|
## +---+----+

它不会引入BatchPythonEvaluation,因此应该比使用UDF更有效。

答案 1 :(得分:5)

这会将empty-value替换为None列中的name

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


df = sc.parallelize([(1, "empty-value"), (2, "something else")]).toDF(["key", "name"])
new_column_udf = udf(lambda name: None if name == "empty-value" else name, StringType())
new_df = df.withColumn("name", new_column_udf(df.name))
new_df.collect()

输出:

[Row(key=1, name=None), Row(key=2, name=u'something else')]

通过将旧名称用作withColumn中的第一个参数,它实际上将旧name列替换为UDF输出生成的新列。

答案 2 :(得分:2)

您也可以将dict用作replace的第一个参数。我尝试了一下,这似乎接受了None作为参数。

df = df.replace({'empty-value':None}, subset=['NAME'])

请注意,您的'empty-value' needs to be hashable

答案 3 :(得分:0)

最好的选择是结合使用whenNULL。示例:

from pyspark.sql.functions import when, lit, col

df= df.withColumn('foo', when(col('foo') != 'empty-value',col('foo)))

如果要将多个值替换为null,可以在|条件内使用when或功能强大的create_map函数。

需要注意的是,最差的方法是通过使用 UDF 来解决的。之所以如此,是因为udfs为您的代码提供了极大的通用性,但是对性能造成了巨大的损失