2016-04-27 20 views
0

は、私はこのような何かをしたい:PySparkで文字列値をNULLに置き換えるにはどうすればよいですか?

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

は基本的に、私はNULLでいくつかの値を置き換えたいです。この関数ではNoneを受け付けません。これどうやってするの?それはBatchPythonEvaluationを導入しない

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| 
## +---+----+ 

とそのためUDFを使用するよりもはるかに効率的でなければなりません:

答えて

2

これはあなたのname列にNoneempty-valueに置き換えられますwithColumnの最初のパラメータとして古い名前を使用することにより

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

、それは実際に古いname列を置き換え新しいものはUDF出力によって生成されます。

+0

私はUDFを試していないと思っていました。 – talloaktrees

9

あなたは次のようにNULLリテラルと型鋳造でwhen句を組み合わせることができます。

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() 

出力:

+2

大規模なデータセットの方がはるかに効率的です。 – cftarnas

+0

@cftarnasそれは、Python UDFは比較的高いserdeオーバーヘッドを持っています。 – zero323

関連する問題