目标表模式
阶段表模式
主键模式
我们有一个 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在这一步执行大量的洗牌,它运行数小时,有时会失败。
暂无答案!
目前还没有任何答案,快来回答吧!