2016-04-27 10 views

Antwort

2

Dies wird ersetzen empty-value mit None in Ihrer name Säule:

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

Ausgang:

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

den alten Namen als ersten Parameter in withColumn Durch die Verwendung ersetzt es tatsächlich die alte name Spalte mit dem neuen, der von der UDF-Ausgabe erzeugt wird.

+0

Ich dachte nicht daran, UDFs auszuprobieren, das scheint der richtige Weg zu sein – talloaktrees

9

können Sie kombinieren when Klausel mit NULL wörtlichen und Casting-Typen wie folgt:

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

Es ist nicht BatchPythonEvaluation einführt und aus diesem Grund sollte als mit einem UDF wesentlich effizienter sein.

+2

Hervorragend, viel effizienter für große Datensätze. – cftarnas

+0

@cftarnas Es ist, Python UDFs haben relativ hohe Server Overhead. – zero323

Verwandte Themen