我想做类似这样的事情:
df.replace('empty-value', None, 'NAME')
基本上,我想用NULL
替换一些值,但它不接受None
作为参数。我该怎么做?
我想做类似这样的事情:
df.replace('empty-value', None, 'NAME')
基本上,我想用NULL
替换一些值,但它不接受None
作为参数。我该怎么做?
您可以按如下方式将 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相比应该更高效。
这将在您的name
列中将empty-value
替换为None
:
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
中使用旧名称作为第一个参数,实际上用UDF的输出生成的新列替换了旧的name
列。你也可以直接使用字典作为 replace
函数的第一个参数。我已经尝试过,似乎这个函数可以接受 None
作为参数。
df = df.replace({'empty-value':None}, subset=['NAME'])
'empty-value'
需要是可哈希的。点击了解更多。when
与NULL
相结合。例如:from pyspark.sql.functions import when, lit, col
df= df.withColumn('foo', when(col('foo') != 'empty-value',col('foo)))
如果您想将多个值替换为null,可以在when
条件中使用|
或者使用强大的create_map函数。
请注意,最糟糕的解决方法是使用UDF。这是因为udf提供了代码的极大灵活性,但会带来巨大的性能损失。
otherwise()
部分 -when()
默认会返回null
。 - pault