Python Pyspark:有条件地用空格连接列
鉴于我有下表:Python Pyspark:有条件地用空格连接列,python,pyspark,Python,Pyspark,鉴于我有下表: ColA | ColB | ColC | ColD Name BA CC DA Name BB CC DA 我想检查所有行的ColB、ColC和ColD值是否相同(名称始终相同)。如果是,我需要按原样返回df。如果不是,我应该在我的可乐后面加上那些不同的 所以在这个场景中,我们有不一致的B列,我的结果表应该如下所示: ColA | ColB
ColA | ColB | ColC | ColD
Name BA CC DA
Name BB CC DA
我想检查所有行的ColB、ColC和ColD值是否相同(名称始终相同)。如果是,我需要按原样返回df。如果不是,我应该在我的可乐后面加上那些不同的
所以在这个场景中,我们有不一致的B列,我的结果表应该如下所示:
ColA | ColB | ColC | ColD
Name BA BA CC DA
Name BB BB CC DA
我遇到了一些麻烦,但我还是想出了这个函数。然而,问题是我不能让它与空白一起工作。所以现在我的结果是这样的:
ColA | ColB | ColC | ColD
NameBA BA CC DA
NameBB BB CC DA
功能:
def id(df, cols):
"""
"""
def is_not_unique_col(df, x):
"""
"""
if len(df.select(x).distinct().collect()) != 1:
return True
else:
return False
def concat_with_whitespace(*cols):
"""
"""
return F.concat(*[F.coalesce(c, F.lit(" ")) for c in cols])
non_unique_cols = [x for x in cols if is_not_unique_col(df, x)]
if len(non_unique_cols)>0:
df = df.withColumn("ColA_New", concat_with_whitespace("ColA", *non_unique_cols)).drop("ColA")
df = df.withColumnRenamed("ColA_New", "ColA").drop("ColA_New")
return df
else:
return df
我有一个
is\u not\u unique\u col
函数,它检查一列是否有多个值。我为我的所有列运行它,返回True的列被附加到非唯一列列表中,该列表用作带有空格的concat\u函数的输入。我在中添加了这个F.lit(“”)
,以便获得我的空白。一切似乎都是正确的,但我不能使它工作。如果有人能拿走一本书,我将不胜感激,也许这是个愚蠢的错误。我会给你一个不使用任何自定义项的解决方案
使用collect\u set()
获取具有非唯一值的列名列表
from pyspark.sql import functions as F
from pyspark.sql.functions import *
diff_col = [i for i in df.schema.names if \
(df.select(F.size(F.collect_set(i))).collect()[0][0] > 1)]
关于合同:
df.select(col("*"), concat(col("ColA"), lit(" "),concat(*diff_col))\
.alias("concat_col")).show()
+----+----+----+----+----------+
|ColA|ColB|ColC|ColD|concat_col|
+----+----+----+----+----------+
|Name| BA| CC| DA| Name BA|
|Name| BB| CC| DA| Name BB|
+----+----+----+----+----------+
或者,如果希望在多列的concat之间留有空格(如果有多列的非唯一值),则:
df.select(col("*"), concat(col("ColA"), lit(" "),\
concat(*[F.concat(col(i),F.lit(" "))for i in diff_col])).alias("concat_col")).show()