取消
顯示的結果
而不是尋找
你的意思是:

在這兩個場景中pyspark如何工作?

Direo
貢獻者

我有兩個場景與不同的結果:

場景1:

從pyspark.sql。功能導入*

#創建示例dataframes

df1 =火花。createDataFrame ([(1、2、3), (2、3、4)], [“a”、“b”、“c”))

df2 =火花。createDataFrame ([(1、5、6、7), (2, 8, 9, 10)], [“a”、“d”、“e”,“f”))

df3 =火花。createDataFrame ([(1、11、12), (2, 13、14)], [“a”、“g”、“h”))

#加入dataframes並選擇列

= df1基地。加入(df2,“a”,“左”)。加入(df3,“a”,“左”)。選擇(“a”、“b”、“e”,“g”)

#應用過濾器

最後= base.filter(坳(“c”) = = 1)

場景2:

從pyspark.sql。功能導入*

#創建示例dataframes

df1 =火花。createDataFrame ([(1、2、3), (2、3、4)], [“a”、“b”、“c”))

df2 =火花。createDataFrame ([(1、5、6、7), (2, 8, 9, 10)], [“a”、“d”、“e”,“f”))

df3 =火花。createDataFrame ([(1、11、12), (2, 13、14)], [“a”、“g”、“h”))

df4 = spark.createDataFrame (((1), (2)]、[a])

df5 =火花。createDataFrame ([(1,“x”), (2, y)], [“a”,“z”))

#加入dataframes

= df1基地。加入(df2,“a”,“左”)。加入(df3,“a”,“左”)。選擇(“a”、“b”、“e”,“g”)

base_join =基地。加入(df4,“a”)。加入(df5,“a”,“左”)。選擇(“a”、“b”)

#應用過濾器

最後= base_join .filter(坳(“c”) = = 1)

我第一個場景過濾器(坳(“c”) = = 1)將應用和dataframe稱為最後的創建,在場景2中,將失敗與錯誤”專欄“c”不存在“即使base_join df在第二個場景中與基地df第一沒有這一列。

有什麼區別,為什麼在物理計劃嗎?

1接受解決方案

接受的解決方案

匿名
不適用

@Direo Direo:

兩種情況的區別在於執行計劃所產生的火花。當火花優化並執行一個查詢,它生成一個具體的計劃,包括所有的操作需要執行產生最終結果。物理計劃通過一係列優化生成的邏輯計劃查詢,如謂詞下推,投影修剪,加入重新排序。

在第一個場景中,直接用於基礎dataframe過濾操作,它隻包含列“a”、“b”,“e”和“g”。因此,當火花產生的物理方案,它不包括“c”列,因為它不需要過濾的操作。

在第二個場景中,過濾操作應用於base_join dataframe,這是一個連接操作的結果,包括“a”、“b”,“e”和“g”列。然而,df1 dataframe,其中包含“c”列,也包括在連接操作。因此,當火花產生的物理方案,它包括“c”列在連接操作,即使它是不習慣在最後的過濾操作。

修複錯誤在第二個場景中,你可以添加一個投影操作

base_join刪除“c”列在應用過濾器之前操作:

base_join =基地。加入(df4,“a”)。加入(df5,“a”,“左”)。選擇(“a”、“b”、“e”,“g”) base_join_projected = base_join.drop (“c”)最終= base_join_projected.filter(坳(“c”) = = 1)

這將從物理刪除“c”列計劃,和過濾操作應正常工作。

在原帖子查看解決方案

2回答2

匿名
不適用

@Direo Direo:

兩種情況的區別在於執行計劃所產生的火花。當火花優化並執行一個查詢,它生成一個具體的計劃,包括所有的操作需要執行產生最終結果。物理計劃通過一係列優化生成的邏輯計劃查詢,如謂詞下推,投影修剪,加入重新排序。

在第一個場景中,直接用於基礎dataframe過濾操作,它隻包含列“a”、“b”,“e”和“g”。因此,當火花產生的物理方案,它不包括“c”列,因為它不需要過濾的操作。

在第二個場景中,過濾操作應用於base_join dataframe,這是一個連接操作的結果,包括“a”、“b”,“e”和“g”列。然而,df1 dataframe,其中包含“c”列,也包括在連接操作。因此,當火花產生的物理方案,它包括“c”列在連接操作,即使它是不習慣在最後的過濾操作。

修複錯誤在第二個場景中,你可以添加一個投影操作

base_join刪除“c”列在應用過濾器之前操作:

base_join =基地。加入(df4,“a”)。加入(df5,“a”,“左”)。選擇(“a”、“b”、“e”,“g”) base_join_projected = base_join.drop (“c”)最終= base_join_projected.filter(坳(“c”) = = 1)

這將從物理刪除“c”列計劃,和過濾操作應正常工作。

Vidula_Khanna
主持人
主持人

嗨@Direo Direo

謝謝你發布你的問題在我們的社區!我們很高興幫助你。

幫助我們為您提供最準確的信息,請您花一些時間來回顧反應和選擇一個最好的回答了你的問題嗎?

這也將有助於其他社區成員可能也有類似的問題在未來。謝謝你的參與,讓我們知道如果你需要任何進一步的援助!

歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map