我有兩個資料幀,我想使用多個列將一個資料幀與另一個資料幀進行比較,這樣如果來自一個資料幀的列值元組存在于另一個資料幀中,則會在第一個資料幀中放置一個指示符(例如,tupleExistsInDf2 = True)。示例代碼:
import pandas as pd
from datetime import date
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df1 = pd.DataFrame({
"pk": [1, 1, 1, 1, 2, 2, 2, 2, 3, 4],
"date": [
date("2022-05-06"),
date("2022-05-13"),
date("2022-05-06"),
date("2022-05-06"),
date("2022-05-14"),
date("2022-05-15"),
date("2022-05-05"),
date("2022-05-05"),
date("2022-05-11"),
date("2022-05-12")
],
"variable": [A, B, C, D, A, A, E, F, A, G]
})
df1 = spark.createDataFrame(df1)
df2 = pd.DataFrame({
"pk": [1, 1, 2, 2, 2, 3, 4, 5, 6, 6],
"date": [
date("2022-05-06"),
date("2022-05-13"),
date("2022-05-14"),
date("2022-05-15"),
date("2022-05-05"),
date("2022-05-11"),
date("2022-05-08"),
date("2022-05-03"),
date("2022-05-07"),
date("2022-05-08")
],
"variable": [A, B, A, A, E, A, A, H, A, A]
})
df2 = spark.createDataFrame(df2)
這會產生兩個 pyspark 資料幀:
df1.show()
# ----- ----------- --------
#|pk | date|variable|
# ----- ----------- --------
#| 1| 2022-05-06| A|
#| 1| 2022-05-13| B|
#| 1| 2022-05-06| C|
#| 1| 2022-05-06| D|
#| 2| 2022-05-14| A|
#| 2| 2022-05-15| A|
#| 2| 2022-05-05| E|
#| 2| 2022-05-05| F|
#| 3| 2022-05-11| A|
#| 4| 2022-05-12| G|
# ----- ----------- --------
df2.show()
# ----- ----------- --------
#|pk | date|variable|
# ----- ----------- --------
#| 1| 2022-05-06| A|
#| 1| 2022-05-13| B|
#| 2| 2022-05-14| A|
#| 2| 2022-05-15| A|
#| 2| 2022-05-05| E|
#| 3| 2022-05-11| A|
#| 4| 2022-05-08| A|
#| 5| 2022-05-03| H|
#| 6| 2022-05-07| A|
#| 6| 2022-05-08| A|
# ----- ----------- --------
我想要做的是表明df1每個元組是否(pk, date, variable)存在于df2. 此示例的結果將是:
# ----- ----------- -------- ----------------
#|pk | date|variable|tupleExistsInDf2|
# ----- ----------- -------- ----------------
#| 1| 2022-05-06| A| True|
#| 1| 2022-05-13| B| True|
#| 1| 2022-05-06| C| False|
#| 1| 2022-05-06| D| False|
#| 2| 2022-05-14| A| True|
#| 2| 2022-05-15| A| False|
#| 2| 2022-05-05| E| True|
#| 2| 2022-05-05| F| False|
#| 3| 2022-05-11| A| True|
#| 4| 2022-05-12| G| False|
# ----- ----------- -------- ----------------
uj5u.com熱心網友回復:
使用intersection可能就足夠了,因為它比 False/True 列更有用。但如果你需要它,這里是你所要求的 sudo 代碼:
- 走十字路口
- 創建連接條件
- 左外連接并僅選擇所需的列
- 使用 Coalesce 填充空值。 naFill也可以。
.
import pyspark.sql.functions as f
intersection = df1.intersect(df2).withColumn("tupleExistsInDf2", f.lit(True) ) # collect columns that are in both tables.
cond = [df1.pk==intersection.pk, df1.date==intersection.date, df1.variable==intersection.variable] # create join condition
df1.join( intersection , cond, "leftouter")\
.select( df1.pk,df1.date,df1.variable, f.coalesce(intersection.tupleExistsInDf2, f.lit(False) ) )
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/477862.html
下一篇:spark不顯示所有內容
