запись нескольких заданий искры в одну и ту же секционированную внешнюю таблицу улья - spark 2.3 - PullRequest
1 голос
/ 29 мая 2020

У меня есть внешний стол Hive MyTable, где partition(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

Примечание - 2 insertinto() в приведенной выше функции по какой-то причине запускается последовательно. Внутри одного искрового приложения я запускаю несколько искровых заданий, которые записывают в 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=201910101 до 20190105

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
...