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