2016-11-03 47 views
6

我有以下的數據幀data使用一個以上的collect_list在星火SQL一個查詢

root 
|-- userId: string 
|-- product: string 
|-- rating: double 

和下面的查詢:

val result = sqlContext.sql("select userId, collect_list(product), collect_list(rating) from data group by userId") 

我的問題是,不productrating在聚合數組相互匹配?也就是說,來自同一行的productrating在聚合陣列中是否具有相同的索引。

更新: 從Spark 2.0.0開始,人們可以對結構類型執行collect_list,因此我們可以在組合列上執行一個collect_list。但對於2.0.0之前版本,只能在原始類型上使用collect_list

回答

6

我相信沒有明確的保證,所有的數組將具有相同的順序。 Spark SQL使用多次優化,並且在某些情況下,不能保證所有聚合都在同一時間進行調度(一個示例是使用DISTINCT進行聚合)。由於交換(洗牌)導致非確定性順序,理論上可能的順序會有所不同。

因此,雖然它應該在實踐中工作,但它可能會有風險,並會引入一些難以檢測到的錯誤。

如果您星火2.0.0或更高版本,你可以聚合非原子列與collect_list

SELECT userId, collect_list(struct(product, rating)) FROM data GROUP BY userId 

如果您使用的是早期版本,你可以嘗試使用明確的分區和秩序:

WITH tmp AS (
    SELECT * FROM data DISTRIBUTE BY userId SORT BY userId, product, rating 
) 
SELECT userId, collect_list(product), collect_list(rating) 
FROM tmp 
GROUP BY userId 
+0

如何使用'cogroup'作爲大數據集,就像我使用'collect()'時拋出內存異常'rdd1 = rdd2.cogroup(rdd3).collect'。你可以幫助解決這個問題[https://stackoverflow.com/questions/47180307/how-to-use-cogroup-for-large-datasets]。可以分區幫助我是新來的任何幫助來解決這個問題。 – Vignesh