Сбой запроса Hive с ошибкой "файл не найден", которая не должна быть возможной - PullRequest
0 голосов
/ 31 марта 2020

У меня есть внешняя таблица улья, которая разделена по дате и времени ее вставки, например, 20200331_0505 в формате YYYYMMDD_HHMM.

В настоящее время существует только один раздел:

> hdfs dfs -ls /path/to/external/table    
-rw-r----- 2020-03-31 05:06 /path/to/external/table/_SUCCESS  
drwxr-x--- 2020-03-31 05:06 /path/to/external/table/loaddate=20200331_0505  

И если я выполню запрос улья, чтобы найти разделы:

select distinct loaddate from table;  
+----------------+
|    loaddate    |
+----------------+
| 20200331_0505  |
+----------------+

Что ожидается и чего я хочу чтобы увидеть, но если я запускаю это:

select * from table where loaddate=(select max(loaddate) from table);
Тогда я получаю эту ошибку:

ERROR : FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Vertex failed, vertexName=Map 3, vertexId=vertex_1585179445264_14095_4_00, diagnostics=[Vertex vertex_1585179445264_14095_4_00 [Map 3] killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: <Table> initializer failed, vertex=vertex_1585179445264_14095_4_00 [Map 3], java.lang.RuntimeException: ORC split generation failed with exception: java.io.FileNotFoundException: File hdfs://path/to/external/table/loaddate=20200327_0513 does not exist.
        at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat.generateSplitsInfo(OrcInputFormat.java:1851)
        at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat.getSplits(OrcInputFormat.java:1939)
        at org.apache.hadoop.hive.ql.io.HiveInputFormat.addSplitsForGroup(HiveInputFormat.java:524)
        at org.apache.hadoop.hive.ql.io.HiveInputFormat.getSplits(HiveInputFormat.java:779)
        at org.apache.hadoop.hive.ql.exec.tez.HiveSplitGenerator.initialize(HiveSplitGenerator.java:243)

Итак, он пытается загрузить раздел, который не существует, 20200327_0513, что может быть причиной этого?

1 Ответ

0 голосов
/ 31 марта 2020

Когда вы удаляете разделы либо напрямую с помощью команды rm, либо с помощью чего-то наподобие команды SaveMode.Overwrite write, он не предупреждает куст об изменениях в разделах, поэтому вы должны сообщить hive, что разделы изменились. Есть много способов сделать это, способ, который я выбрал, чтобы исправить это было:

msck repair table <table> sync partitions

...