我想做的
df = #所有id的沒有一個是有效的id在IDs中:#來自不同數據源的數據得到的部分df_1 = spark.read.parquet (url_for_id) df_2 = spark.read.parquet (url_for_id)…#結合部分基於時間和他們共同列id df_join = df_1。加入(= idx_columns df_2, =內部). join () ....withColumn (“id”,點燃(id)) #加入所有id到一個大表,如果df = =沒有:df =其他df_join: df.union (df_join) #現在寫出來與df.writeTo新的工作表(表).createOrReplace ()
每個ID都有100 GB的數據分解成0.5 - 1.5 GB的塊。聯盟的總大小表將在7和10 TBs。
發生了什麼事
引起的:java . util . concurrent。ExecutionException: . lang。RuntimeException:內部:/ local_disk0 /火花-…/執行器-…/ dbio_cache_root_…/ unified_cache -…/…/…/…:設備上沒有剩餘空間
似乎工會不聰明,因為當我每個ID執行這個級別,它將正常工作。
我需要幫助
什麼是最好的方式來處理這些大數據連接?我怎麼能讀和寫數據是否有效?
例如:
請幫助。
@Erik路易:
有幾個策略,您可以使用它們來處理大型加入這樣的火花:
在閱讀和寫作方麵的數據,您可能需要考慮使用分布式文件係統(比如HDFS或S3存儲您的數據,它可以幫助可擴展性和容錯性。您可以使用
讀()和寫()函數在火花從這些文件係統讀取和寫入數據。
總的來說,最好的策略來處理大型連接將取決於你的數據和用例的細節。你可能需要嚐試不同的方法和配置需要找到最優解。
謝謝你的全麵的反應——我看看其中的一些。額外的上下文,這裏有一些限製數據:
所有的表都應該_mostly_相同的尺寸和相同的密鑰生成過程,生成時間序列數據(也就是說,拚花表的數據源是一係列在S3中按時間排序,每個時間戳將_usually_存在於所有N表,但不總是這樣)。攝入之前,這些表是按時間戳排序,但火花打亂的攝取,因為我運行一個unix時間戳一個ISO的時間戳(我真的想避免這種情況,如果可能的話,但是我不知道除了“bucketBy”和“sortBy”之前建議)。
不幸的是,我沒有控製的方式生成這些表,但在未來我意願生成這些表預連接而不是分開,因為沒有價值讓他們分開。