当某些值为空时,如何将 DataFrame 中的多个列连接到另一列中?
How do you concatenate multiple columns in a DataFrame into a another column when some values are null?
def column_concat(a,b):
return 连接(a,b)<br>
searches_df = searches_df.withColumn('unique_id',reduce(column_concat,(searches_df[col] for col in search_parameters)))
除非列包含空值,否则整个连接的字符串都为空。我想在连接的字符串中使用占位符或某个字符。
给定以下数据框:
df = sqlContext.createDataFrame([("foo", "bar"), ("baz", None)],
('a', 'b'))
df.show()
+---+----+
| a| b|
+---+----+
|foo| bar|
|baz|null|
+---+----+
一种解决方案是使用 udf 来 filter/replace 空值,例如:
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*|
+---+----+---------+
df = df.withColumn('joined_column', sf.concat(sf.col('colname1'),sf.lit('_'), sf.col('colname2')))
您需要先导入 pyspark sql 函数,如下所示
from pyspark.sql import functions as sf
df = df.withColumn('joined_column', sf.concat(sf.col('colname1'),sf.lit('_'), sf.col('colname2')))
在Spark Scala中,您可以先将这些列的空值填充为NA
(一个可以取任何值),然后执行连接操作。它工作得很好。
df = df.na.fill("NA").concat(col A, col B, col C, col D, col E)
def column_concat(a,b):
return 连接(a,b)<br>
searches_df = searches_df.withColumn('unique_id',reduce(column_concat,(searches_df[col] for col in search_parameters)))
除非列包含空值,否则整个连接的字符串都为空。我想在连接的字符串中使用占位符或某个字符。
给定以下数据框:
df = sqlContext.createDataFrame([("foo", "bar"), ("baz", None)],
('a', 'b'))
df.show()
+---+----+
| a| b|
+---+----+
|foo| bar|
|baz|null|
+---+----+
一种解决方案是使用 udf 来 filter/replace 空值,例如:
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*|
+---+----+---------+
df = df.withColumn('joined_column', sf.concat(sf.col('colname1'),sf.lit('_'), sf.col('colname2')))
您需要先导入 pyspark sql 函数,如下所示
from pyspark.sql import functions as sf
df = df.withColumn('joined_column', sf.concat(sf.col('colname1'),sf.lit('_'), sf.col('colname2')))
在Spark Scala中,您可以先将这些列的空值填充为NA
(一个可以取任何值),然后执行连接操作。它工作得很好。
df = df.na.fill("NA").concat(col A, col B, col C, col D, col E)