2016-09-08 40 views

回答

4

假定下列數據幀:

df = sqlContext.createDataFrame([("foo", "bar"), ("baz", None)], 
           ('a', 'b')) 
df.show() 

+---+----+ 
| a| b| 
+---+----+ 
|foo| bar| 
|baz|null| 
+---+----+ 

一種解決方案是使用UDF來過濾/替換空(一個或多個),例如:其產生

import pyspark.sql.functions as F 
from pyspark.sql.types import StringType 

concat_udf = F.udf(lambda cols: "".join([x if x is not None else "*" for x in cols]), StringType()) 
df.withColumn("unique_id", concat_udf(F.array("a", "b"))).show() 

+---+----+---------+ 
| a| b|unique_id| 
+---+----+---------+ 
|foo| bar| foobar| 
|baz|null|  baz*| 
+---+----+---------+ 

或者:

import pyspark.sql.functions as F 

def myConcat(*cols): 
    return F.concat(*[F.coalesce(c, F.lit("*")) for c in cols]) 

df.withColumn("unique_id", myConcat("a", "b")).show() 

這也產生了:

+---+----+---------+ 
| a| b|unique_id| 
+---+----+---------+ 
|foo| bar| foobar| 
|baz|null|  baz*| 
+---+----+---------+ 
+0

謝謝!我通過使用concat_ws來解決問題,但是如果需要佔位符,這些解決方案是有用和必要的。 –

相關問題