У меня есть внешний стол 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