from delta.tables import *
vals1 = [(1, "a"),
(2, "b"),
(3, "c"),
(4, "d")
]
columns1 = ["id","name"]
df1 = spark.createDataFrame(data=vals1, schema=columns1)
# df1.show()
vals2 = [(1, "k"),
(2, "l"),
(3, "m")
]
columns2 = ["id","name"]
df2 = spark.createDataFrame(data=vals2, schema=columns2)
# df2.show()
df1 = df1.join(df2, 'id', 'full')
df1.show()
給我以下結果:
--- ---- ----
| id|name|name|
--- ---- ----
| 1| a| k|
| 3| c| m|
| 2| b| l|
| 4| d|null|
--- ---- ----
如何讓它為“名稱”生成一個包含“k、l、m、d ”值的單列?
(它必須始終使用 df2 中的值,但有一個例外 - 當 df1 中有一行在 df2 中沒有匹配行時,在這種情況下,它需要使用 df1 中的值)。
uj5u.com熱心網友回復:
您可以使用合并。
df1 = (df1.join(df2, 'id', 'left')
.select('id', F.coalesce(df2.name, df1.name).alias('name')))
==================================================== ==========
更新
df1 = (df1.join(df2, 'id', 'left')
.select('id',
*[F.coalesce(df2[x], df1[x]).alias(x) for x in df1.columns if x != 'id' and x in df2.columns]))
==================================================== ==========
更新2
我想我理解你的要求。我調整你的樣本資料來說明你的情況。
df1
id name
1 a
2 b
3 c
4 d
df2
id name
1 null
2 l
3 m
如果這是您的輸入資料,您應該保留所有值,包括來自 的空值(對于 id 1)df2,但您需要來自的值d,df1因為 id4中缺少df2。
預期結果應如下所示
id name
1 null
2 l
3 m
4 d
在這種情況下,沒有簡單的指標來區分空值是來自原始資料還是來自外部合并的結果。
解決此問題的一種方法是在連接之前將空值替換為其他值,然后在連接后替換回來。
null_value = 'NA'
df2 = df2.na.fill(null_value)
df1 = (df1.join(df2, 'id', 'full')
.select('id',
*[F.coalesce(df2[x], df1[x]).alias(x) for x in df1.columns if x != 'id' and x in df2.columns])
.replace(null_value, None))
uj5u.com熱心網友回復:
這應該適合你:
df_new(加入 df1 和 df2 后的新資料幀)
df_1 = df_1.select(F.col('id'),F.col('name').alias('name_df1'))
df_2 = df_2.select(F.col('id'),F.col('name').alias('name_df2'))
df_new = df_1.join(df_2, on="id", how="outer") \
.withColumn('name',F.coalesce('name_df2','name_df1')) \
.select('id','name')
如果您有一個龐大的資料集,這不是最有效的答案,但是:
- 當您嘗試理解這些步驟時更具可讀性
- 將為您提供您正在尋找的輸出
uj5u.com熱心網友回復:
最簡單的解決方案,在 case 時使用 pyspark
>>> from pyspark.sql.functions import when
#i have renamed cols from df2 to avoid ambiguity
>>> df_join = df1.join(df2,df1.id==df2.df2_id,"full")
>>>df_join1=df_join.withColumn("new_col",when(df_join.df2_name.isNull(),df_join.name).otherwise(df_join.df2_name))
>>> df_output=df_join1.select("id","name","new_col")
>>> df_output.show()
--- ---- -------
| id|name|new_col|
--- ---- -------
| 1| a| k|
| 3| c| m|
| 2| b| l|
| 4| d| d|
--- ---- -------
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/491782.html
上一篇:Linux Cgroup v1(中文翻譯)(6):Memory Resource Controller
下一篇:獲取每個基于陣列的行的唯一元素
