首页 > 解决方案 > 多个 spark 作业写入同一个 hive 分区外部表 - spark 2.3

问题描述

我有存储为镶木地板的 Hive 外部MyTablepartition(load_date:String, load_type:String)。函数 loadData(start,end)是一个包装函数,df.insertinto()最后有一个火花动作。使用输入调用此函数loadData(20190101,20190103)将在 HDFS 目录结构下创建

load_date=2019101/type=A
load_date=2019101/type=B
load_date=2019102/type=A
load_date=2019102/type=B
load_date=2019103/type=A
load_date=2019103/type=B


def loadData(start,end):
       .... 
       // dynamic insert for start to end date range
       df.write.mode(SaveMode.Overwrite).insertInto(MyTable) // for type A
       ....
       df.write.mode(SaveMode.Overwrite).insertInto(MyTable) // for Type B

注意 -insertinto()上述函数中的 2 出于某种原因顺序运行。在单个火花应用程序中,我旋转多个写入Mytable但每个作业写入单独分区的火花作业,例如 -

val interval= [ (20190101,20190105), (20190106,20190110), (20190111,20190115), .....]

interval.grouped(3).foreach(grp => grp.par.foreach(slot => loadData(slot._1,slot._2))

3个作业按预期并行触发,申请成功完成。但在输出 HDFS 位置,我看到一些随机分区丢失。

例如,内部type=B缺少分区load_date=20191010120190105

load_date=20190101/type=A
load_date=20190102/type=A
load_date=20190103/type=A
load_date=20190104/type=A
load_date=20190105/type=A
load_date=20190106/type=A
load_date=20190107/type=A
load_date=20190108/type=A
load_date=20190109/type=A
load_date=201901010/type=A
load_date=20190106/type=B
load_date=20190107/type=B
load_date=20190108/type=B
load_date=20190109/type=B
load_date=201901010/type=B

标签: apache-sparkhiveapache-spark-sqlparquet

解决方案


推荐阅读