2016-12-20 26 views
0

當我在SparkSQL中使用窗口函數時,出現以下警告消息。任何人都可以請讓我知道如何解決這個問題。在SparkSQL數據框中使用窗口函數時出現的警告消息

警告消息: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.

我的代碼: def calcPrevBrdrx(df: DataFrame): DataFrame = { val w = Window.orderBy("existing_col1") df.withColumn("new_col", lag("existing_col2", 1).over(w)) }

+0

基本上我通過使用窗口滯後函數添加一個新列(new_col),它與「existing_col2」相比只是向下滑動一行。 – Ramesh

+0

我可以在新數據幀中看到新列'new_col'按預期正確創建。但如上所述,我收到警告信息。 – Ramesh

回答

0

警告正是它說。一般來說,當您使用窗口函數時,您首先會按某列進行分區,然後才能進行排序。因此,例如,如果您有一個用戶的日誌,那麼您可能會按用戶進行分區,然後按時間排序,這樣可以分別爲每個用戶進行排序。

如果您之前沒有分區,那麼您將對整個數據框進行排序。這基本上意味着你有一個分區。所有數據幀中的所有數據都將移至該單個分區並進行排序。

這會很慢(你正在洗牌一切,然後排序所有內容),更糟糕的是,這意味着你的所有數據都需要放在一個不可擴展的分區中。

你應該看看你的邏輯,以確保你真的需要排序的一切,而不是以前的東西分區。

+0

是的,我嘗試通過Window.orderBy(「existing_col1」)。partitionBy(「existing_col2」,「existing_col3」) – Ramesh

+0

是的我嘗試通過Window.orderBy(「existing_col1」)。partitionBy(「existing_col2」, 「existing_col3」)但是我添加的新字段'new_col'對於所有行都是空的。 – Ramesh

+0

如果你通過兩列進行分區,那麼你已經爲每個元組排序了數據。如果每個元組只有一個值,您將得到空值(因爲沒有滯後)。既然你試圖找到列「existing_col2」的滯後,我會這樣做:Window.partitionBy(「existing_col2」)。orderBy(「existing_col1」) –