笛卡兒積是一種常見的操作兩個表的向量積。
例如,假設你有一個客戶和你的產品目錄的列表的列表和想要得到所有客戶——產beplay体育app下载地址品組合的叉積。
然而笛卡爾產品可以是一個很昂貴的操作。即使有6000產品和100000客戶的輸出將6億條記錄(6 k x 100 k = 600)beplay体育app下载地址
這樣做有效地激發嚐試以下方法:
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路徑(……)
引發快樂!
這樣做有效地激發嚐試以下方法:
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路徑(……)
引發快樂!