Pyspark eval或expr-使用when语句连接多个数据框列

问题描述

我正在尝试连接多个数据框列,但是当concat_ws内的语句无法在下面执行pyspark eval或expr时。

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
from pyspark.sql.functions import concat_ws,concat,when,col,expr
from pyspark.sql.functions import lit
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame([("foo","bar"),("ba z",None)],('a','b'))
keys = ['a','b']
key_val = ''
for key in keys:
    key_val = key_val + 'when(df["{0}"].isNull(),lit("_")).otherwise(df["{0}"]),'.format(key) 
key_val_exp = key_val.rsplit(',',1)[0]
spaceDeleteUDF = udf(lambda s: str(s).replace(" ","_").strip(),StringType())
df=df.withColumn("unique_id",spaceDeleteUDF(concat_ws("-",eval(key_val_exp))))

错误:

"TypeError: Invalid argument,not a string or column: (Column<b'CASE WHEN (a IS NULL) THEN _ ELSE a END'>,Column<b'CASE WHEN (b IS NULL) THEN _ ELSE b END'>) of type <class 'tuple'>. For column literals,use 'lit','array','struct' or 'create_map' function."

预期输出:

+----+----+---------+
|   a|   b|unique_id|
+----+----+---------+
| foo| bar|  foo-bar|
|ba z|null|   ba_z-_|
+----+----+---------+

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)