sparkscala:更新/插入海量数据数百万行数据从下游表更新/插入

6fe3ivhb  于 2021-05-17  发布在  Spark
关注(0)|答案(0)|浏览(311)

目标表模式
阶段表模式
主键模式
我们有一个 targetTable dataframe,它拥有像1000万到1亿条独特记录这样的巨大数据。
我们有一个 stageTable 具有如上所述的精确模式的Dataframe targetTable 大概有10万到100万条独特的记录。 stageTable 包含 unique 要更新的记录 currently 存在于 targetTable .
我们还有一个Dataframe primaryKeys 其中包含 exact same unique 在中看到的主密钥列表 stageTable Dataframe。
目标:更新/替换在stagetable中看到更新的targetTableDataFrame中的所有记录。并将它们写回当前存储targettable的hdfs位置。
我试过的: Approach1 :
将targettable从原始位置复制到临时位置。
已将targettable从临时位置加载到Dataframe中。
已将primarykeysDataframe中的所有primarykeys加载到scala列表primarykeyslist中。 Filtered out targettable中的记录在这个primarykeyslist中,现在我们有了TargetTableDataFrame,没有更新相关的记录。
执行了一个union targettable=targettable union stagetable。请注意模式匹配。
将目标Dataframe重写到原始位置。 Result :这适用于较低的数据量。在targettable有一百万的情况下不起作用。在步骤中花费太多时间从primarykeyslist spark筛选targettable中的记录,这一步做了大量的洗牌,而且从未结束。 Approach2 :
将targettable从原始位置复制到临时位置。
已将targettable从临时位置加载到Dataframe中。
与primarykeys dataframe进行了左联接,并从targettable获取了未找到匹配primarykeys dataframe的行。
现在我们有了targetableDataframe,没有更新相关的记录(因为primarykeys包含只在stagetable中的键列表)
执行了一个union targettable=targettable union stagetable。请注意模式匹配。
将目标Dataframe重写到原始位置。 Result :这在本地、dev、qa和prod工作,卷高达数百万条记录。花太多的时间在步骤中,我们是过度写回目标的原始位置。当我们专门处理Dataframe而不进行计数时,spark是懒惰的,我认为它在执行最后一步时执行所有步骤(即将数据覆盖回原始位置),spark在这一步执行大量的洗牌,它运行数小时,有时会失败。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题