我有一個df1這樣的資料框:

和另一個df2像這樣的資料框:

如何df2使用df1左連接加入,以便我的輸出如下所示?

uj5u.com熱心網友回復:
您可以split在加入之前對它們df1進行explode賦值。
df3 = df1.withColumn('Value', F.explode(F.split('Value', ';')))
df4 = df2.join(df3, 'Value', 'left')
完整示例:
from pyspark.sql import functions as F
df1 = spark.createDataFrame([('apple;banana', 150), ('carrot', 20)], ['Value', 'Amount'])
df2 = spark.createDataFrame([('apple',), ('orange',)], ['Value'])
df3 = df1.withColumn('Value', F.explode(F.split('Value', ';')))
df4 = df2.join(df3, 'Value', 'left')
df4.show()
# ------ ------
# | Value|Amount|
# ------ ------
# | apple| 150|
# |orange| null|
# ------ ------
處理空值。如果要成功加入的兩個資料框中的“值”列中有空值,則需要使用eqNullSafe相等性。使用此條件通常會在輸出資料框中保留兩個資料框中的“值”列。因此,要明確洗掉它,我建議alias在資料幀上使用。
from pyspark.sql import functions as F
df1 = spark.createDataFrame([('apple;banana', 150), (None, 20)], ['Value', 'Amount'])
df2 = spark.createDataFrame([('apple',), ('orange',), (None,)], ['Value'])
df3 = df1.withColumn('Value', F.explode(F.coalesce(F.split('Value', ';'), F.array(F.lit(None)))))
df4 = df2.alias('a').join(
df3.alias('b'),
df2.Value.eqNullSafe(df3.Value),
'left'
).drop(F.col('b.Value'))
df4.show()
# ------ ------
# | Value|Amount|
# ------ ------
# | apple| 150|
# | null| 20|
# |orange| null|
# ------ ------
uj5u.com熱心網友回復:
在左外連接中使用 SQL “like”運算子。嘗試這個
//Input
spark.sql(" select 'apple;banana' value, 150 amount union all select 'carrot', 50 ").createOrReplaceTempView("df1")
spark.sql(" select 'apple' value union all select 'orange' ").createOrReplaceTempView("df2")
//Output
spark.sql("""
select a.value, b.amount
from df2 a
left join df1 b
on ';'||b.value||';' like '%;'||a.value||';%'
""").show(false)
------ ------
|value |amount|
------ ------
|apple |150 |
|orange|null |
------ ------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/524614.html
