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

我怎麼得到一個笛卡兒積的一個巨大的數據集?

User16826991422
貢獻者

笛卡兒積是一種常見的操作兩個表的向量積。

例如,假設你有一個客戶和你的產品目錄的列表的列表和想要得到所有客戶——產beplay体育app下载地址品組合的叉積。

然而笛卡爾產品可以是一個很昂貴的操作。即使有6000產品和100000客戶的輸出將6億條記錄(6 k x 100 k = 600)beplay体育app下载地址

1接受解決方案

接受的解決方案

米克羅斯
貢獻者

這樣做有效地激發嚐試以下方法:

1。緩存兩個數據集(在本例中是6000項產品目錄)。緩存需要重新分配數據時,數據在每個工人所以你可以使用盡可能多的任務。說你,你的集群與人均4核25名工人。因此需要4 * 25 = 100個分區。

= sqlContext.table val產品(“產品”).repartition (100) .cache ()

2。記得要調用一個操作產品DataFrame緩存發生在工作開始之前。

products.take (1)

檢查SparkUI - >存儲選項卡上,確保產品DF緩存已經分布在所有節點。

3所示。暫時禁用廣播連接。廣播連接不適合笛卡爾產品,因為工人們得到那麼多廣播數據垃圾收集他們陷入無限循環,永不結束。記得把這個當查詢完成。

sql設置spark.sql %。autoBroadcastJoinThreshold = 0

4所示。電話連接與其他表不使用一個連接條件。你不需要緩存大表,因為它將一樣長緩存更大的數據集運行叉積。

val客beplay体育app下载地址戶(“客戶”)val加入= =表customers.join(產品)

5。運行一個解釋dataframe計劃在執行之前確認您有一個笛卡兒積操作。

joined.explain ()

= = PhysicalPlan = = CartesianProduct: -ConvertToSafe: + -ScanParquetRelation [customer_key # 45642, # 45643] InputPaths: dbfsbeplay体育app下载地址: / tmp /客戶+ -ConvertToSafe + -ScanParquetRelation [product_key # 45644, # 45645] InputPaths: dbfs: / tmp /產品

6。最後保存結果。

joined.write.save路徑(……)

引發快樂!

在原帖子查看解決方案

5回複5

米克羅斯
貢獻者

這樣做有效地激發嚐試以下方法:

1。緩存兩個數據集(在本例中是6000項產品目錄)。緩存需要重新分配數據時,數據在每個工人所以你可以使用盡可能多的任務。說你,你的集群與人均4核25名工人。因此需要4 * 25 = 100個分區。

= sqlContext.table val產品(“產品”).repartition (100) .cache ()

2。記得要調用一個操作產品DataFrame緩存發生在工作開始之前。

products.take (1)

檢查SparkUI - >存儲選項卡上,確保產品DF緩存已經分布在所有節點。

3所示。暫時禁用廣播連接。廣播連接不適合笛卡爾產品,因為工人們得到那麼多廣播數據垃圾收集他們陷入無限循環,永不結束。記得把這個當查詢完成。

sql設置spark.sql %。autoBroadcastJoinThreshold = 0

4所示。電話連接與其他表不使用一個連接條件。你不需要緩存大表,因為它將一樣長緩存更大的數據集運行叉積。

val客beplay体育app下载地址戶(“客戶”)val加入= =表customers.join(產品)

5。運行一個解釋dataframe計劃在執行之前確認您有一個笛卡兒積操作。

joined.explain ()

= = PhysicalPlan = = CartesianProduct: -ConvertToSafe: + -ScanParquetRelation [customer_key # 45642, # 45643] InputPaths: dbfsbeplay体育app下载地址: / tmp /客戶+ -ConvertToSafe + -ScanParquetRelation [product_key # 45644, # 45645] InputPaths: dbfs: / tmp /產品

6。最後保存結果。

joined.write.save路徑(……)

引發快樂!

danielrmeyer
新的貢獻者二世

這個答案還代表最佳實踐嗎?我好奇加入而不是笛卡爾的使用。為什麼不

val加入= custombeplay体育app下载地址ers.cartesian(產品)
嗎?

danielrmeyer
新的貢獻者二世

我很想知道這仍是最好的建議做一個大的笛卡兒積的火花。例如它是最好使用“加入”而不是“笛卡兒”特別?為什麼不' val加入= customer.cartesian(產品)

Rajjat
新的貢獻者二世

我也有同樣的問題。我有一個大的抽樣和我想計算元素之間的相似度。當我把笛卡兒在這大抽樣,它會導致很多打亂。有什麼方法呢?我們可以comapre優秀而不使用笛卡兒嗎?

val車= bigRDD.cartesian (bigRDD)

@Miklos,請幫我reagrding這個。

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

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

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

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

Baidu
map