2

有誰知道Apache Spark SQL獲得與標準SQL qualify()+ rnk或row_number語句相同的結果的最佳方式嗎?SPARK SQL等效的Qualify + Row_number語句

例如:

  • 我有稱爲statement_data與每個爲100個獨特的account_numbers 12個月記錄的火花數據幀,因此1200在總
  • 記錄每個每月記錄有一個被稱爲「statement_date」,可以字段被用於確定最近的記錄

我希望我的最終結果是一個新的Spark Dataframe,其最近3條記錄(由statement_date降序確定)爲100個唯一account_number因此總共有300個最終記錄。

在標準的Teradata SQL,我可以做到以下幾點:

select * from statement_data 
qualify row_number() 
over(partition by acct_id order by statement_date desc) <= 3 

阿帕奇星火SQL不具有獨立資格的功能,我所知道的,也許我搞砸了語法或可」找到符合條件的文檔。

這是好的,如果我需要,只要這兩個步驟是這樣做的兩個步驟:

  • 選擇查詢或替代方法來分配等級/行編號爲每個ACCOUNT_NUMBER的記錄
  • 一選擇查詢,我選擇排名爲< = 3的所有記錄(即選擇第一,第二和第三個最新記錄)。

編輯1 - 7/23 14:09: 由zero323提供的初步解決方案不是在星火1.4.1安裝SQL星火1.4.1依賴爲我工作。

EDIT 2 - 7/23 3:24 pm: 事實證明,這個錯誤與我的查詢使用SQL Context對象而不是Hive Context有關。我現在能夠正確運行下面的解決方案中加入以下代碼後創建和使用蜂巢語境:

final JavaSparkContext sc2; 
final HiveContext hc2; 
DataFrame df; 
hc2 = TestHive$.MODULE$; 
sc2 = new JavaSparkContext(hc2.sparkContext()); 
.... 
// Initial Spark/SQL contexts to set up Dataframes 
SparkConf conf = new SparkConf().setAppName("Statement Test"); 
... 
DataFrame stmtSummary = 
    hc2.sql("SELECT * FROM (SELECT acct_id, stmt_end_dt, stmt_curr_bal, row_number() over (partition by acct_id order by stmt_curr_bal DESC) rank_num FROM stmt_data) tmp WHERE rank_num <= 3"); 

回答

2

沒有qualify(它通常是有用的檢查parser source),但你可以使用子查詢這樣的:

SELECT * FROM (
    SELECT *, row_number() OVER (
     PARTITION BY acct_id ORDER BY statement_date DESC 
    ) rank FROM df 
) tmp WHERE rank <= 3 

又見SPARK : failure: ``union'' expected but `(' found

+0

這是不是爲我工作的星火1.3.1。我在1.4.0中添加了「窗口函數」(partition/order by/desc),並在1.4.0中進行了安裝,然後我會給出這個鏡頭 –

+0

請參閱上面的編輯,獲取有關使窗口函數使用Hive Context 。我接受這個答案,但爲了清楚起見,可以隨意在Hive上下文和SQL上下文中添加附加註釋。 –

+0

@ashK http://stackoverflow.com/q/31786912/1560062 – zero323