亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Pyspark:有條件地用空格連接列

Pyspark:有條件地用空格連接列

holdtom 2023-10-11 15:40:07
鑒于我有下表:ColA     |   ColB   |  ColC  |  ColDName         BA         CC       DA      Name         BB         CC       DA我想檢查所有行的 ColB、ColC 和 ColD 值是否相同(名稱始終相同)。如果是,我需要按原樣返回我的 df 。如果不是,我應該附加那些與我的 ColA 不同的內容。因此,在這種情況下,如果 B 列不一致,我的結果表應如下所示:ColA       |   ColB   |  ColC  |  ColDName BA        BA         CC       DA      Name BB        BB         CC       DA我遇到了一些麻煩,但我想出了這個功能。然而,問題是我無法讓它與空白一起工作。所以目前我的結果是這樣的:ColA       |   ColB   |  ColC  |  ColDNameBA        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_not_unique_col函數,它檢查列是否具有多個值。我對所有列運行它,那些返回 True 的列將附加到 non_unique_cols 列表中,該列表用作我的concat_with_whitespace函數的輸入。我已F.lit(" ")在其中添加了此內容,以便獲得空白。一切似乎都是正確的,但我無法讓它發揮作用。如果有人能看一下,我將不勝感激,也許這是一些愚蠢的錯誤。
查看完整描述

1 回答

?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

我會給你一個不使用任何 UDF 的解決方案。


用于collect_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|

+----+----+----+----+----------+

或者,如果您希望多列的連接之間有空格(如果您有多列非唯一值),則:


df.select(col("*"), concat(col("ColA"), lit(" "),\

    concat(*[F.concat(col(i),F.lit(" "))for i in diff_col])).alias("concat_col")).show()


查看完整回答
反對 回復 2023-10-11
  • 1 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號