Hive: Как мне вставить данные из разделенной таблицы в разделенную таблицу? - PullRequest
1 голос
/ 14 октября 2019

Это расширение предыдущего вопроса, который я задал: Можно ли изменить метаданные существующего столбца в таблице EXTERNAL, определенной файлом схемы AVRO?

Вопрос: В Hive 2.1.1, как мне вставить данные из РАЗДЕЛЕННОЙ таблицы в РАЗДЕЛЕННУЮ таблицу? Какой правильный синтаксис? Я видел материалы по всему Интернету, и, похоже, ни один из них не работает.

Разочарование: Я отправил слишком много вопросов на одну и ту же тему: как изменить данные из существующегоСтолбец STRING в столбец BIGINT в таблице EXTERNAL, созданной файлом метаданных AVRO и сохраненной в формате AVRO. Ничто из этого не похоже на работу. Итак, теперь я создал дубликат * _new таблицы с обновленными метаданными, и теперь я пытаюсь вставить существующие данные в новую таблицу, выбрав из существующей таблицы. И это не работает. Я пробовал многочисленные перестановки HQL для выполнения этой задачи и получил соответствующую перестановку ошибок.

Кажется, что HQL требует PHD в области ракетостроения ... Эта простая задача не должна быть такой сложной.

Пример запроса:

INSERT INTO TableName_New
--PARTITION (partition_year="2000", partition_month="01", partition_date="2000-01-01")
PARTITION (partition_year, partition_month, partition_date)
SELECT Column1, Column2
     --,CAST(Column3 AS BIGINT) Column3
     ,Column3
,partition_year, partition_month, partition_date
--,partition_year, partition_month, partition_date
FROM TableName
WHERE partition_year="2000"
    AND partition_month="01"
    AND partition_date="2000-01-01"

Типичное сообщение об ошибке:

Ошибка при обработке оператора: FAILED: Ошибка выполнения, код возврата 2 из org.apache.hadoop.hive.ql.exec.mr.MapRedTask

Обновление:

Появляется ошибкабыть в утверждении SELECT. Теперь я могу выбрать * без проблем. Но когда я ВЫБИРАЛ либо по конкретному столбцу, либо с помощью ограничения WHERE, я получал ошибку выше в HUE. Я решил выполнить ту же команду в интерфейсе командной строки HIVE и думаю, что, возможно, у меня возникла основная ошибка:

Выдержка снизу:

org.apache. avro.AvroTypeException: найдено длинное, ожидающее объединение

Теперь, что кажется мне странным, так это то, что я сделал DROP и создал новую таблицу, используя измененный файл метаданных AVRO, и я перенес одну PARTITION (содержит3 файла). Я проверил, что и файл метаданных AVRO, и файл PARTITION имеют одинаковые метаданные для Column3. Но в HUE метаданные столбца отображаются как BIGINT. Похоже, что хранилище метаданных Hive не соответствует действительности (я подозреваю, что это из всех проведенных нами испытаний и устранения неисправностей). Как я могу это исправить?

Несмотря на это, я решил пойти дальше и создать новую таблицу, используя старые метаданные, и скопировал файлы разделов в CLFS HDFS. В HUE метаданные Column3 теперь правильно отображаются как STRING. Затем я добавил раздел в таблицу. Я не могу ВЫБРАТЬ * без проблем, но я все еще получаю ту же ошибку выше, когда пытаюсь ВЫБРАТЬ либо по столбцу, либо по ограничению WHERE. Мне интересно, были ли обновлены метаданные column3 для всех строк в файле раздела, а метаданные AVRO, содержащиеся в верхней части файла раздела, не изменились. Я как бы застрял прямо сейчас и открыт для идей.

Проблема 1: Как я могу исправить метаданные исходной таблицы в Hive, учитывая, что файл AVRO правильный?

Проблема 2:Как исправить невозможность ВЫБРАТЬ из старой временной таблицы, если файлы разделов были каким-то образом изменены при запуске команды ALTER COLUMN ... PARTITION (...) CHANGE COLUMN Column3 Column3 BIGINT CASCADE? Я просто запускаю ту же команду, но с STRING вместо BIGINT? ** Полное сообщение об ошибке: **

Ошибка: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Ошибка времени выполнения куста при обработке записи org.apache.hadoop.hive.serde2.avro.AvroGenericRecordWritable @ 439b15f2 at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map (ExecMapper.java:169) в org.apache.hadoop.mapred.MapRunner.run (MapRunner. Java: 54) в org.apache.hadoop.mapred.MapTask.runOldMapper (MapTask.java:465) в org.apache.hadoop.mapred.MapTask.run (MapTask.java:349) в org.apache.hadoop.mapred.YarnChild $ 2.run (YarnChild.java:174)в java.security.AccessController.doPrivileged (собственный метод) в javax.security.auth.Subject.doAs (Subject.java:422) в org.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java:1731) в org.apache.hadoop.mapred.YarnChild.main (YarnChild.java:168) Причина: org.apache.hadoop.hive.ql.metadata.HiveException: Ошибка времени выполнения куста при обработке записи org.apache.hadoop.hive.serde2. avro.AvroGenericRecordWritable@439b15f2 в org.apache.hadoop.hive.ql.exec.MapOperator.process (MapOperator.java:492) в org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map (ExecMapper.j): 160) ... еще 8 Вызвано: org.apache.avro.AvroTypeException: найдено длинное ожидающее объединение в org.apache.avro.io.ResolvingDecoder.doAction (ResolvingDecoder.java:292) вorg.apache.avro.io.parsing.Parser.advance (Parser.java:88) в org.apache.avro.io.ResolvingDecoder.readIndex (ResolvingDecoder.java:267) в org.apache.avro.generic.GenericDatumReader. readWithoutConversion (GenericDatumReader.java:179) вorg.apache.avro.generic.GenericDatumReader.read (GenericDatumReader.java:153) в org.apache.avro.generic.GenericDatumReader.readField (GenericDatumReader.java:232) в org.apache.avroenerDatGenericDatumReader.java:222) в org.apache.avro.generic.GenericDatumReader.readWithoutConversion (GenericDatumReader.java:175) в org.apache.avro.generic.GenericDatumReader.read (GenericDavap.ache.Reache.3).generic.GenericDatumReader.read (GenericDatumReader.java:145) в org.apache.hadoop.hive.serde2.avro.AvroDeserializer $ SchemaReEncoder.reencode (AvroDeserializer.java:110) в org.apache.hadoop.hav. .AvroDeserializer.deserialize (AvroDeserializer.java:174) в org.apache.hadoop.hive.serde2.avro.AvroSerDe.deserialize (AvroSerDe.java:220) в org.apache.hadoop.hive.ql.exec.MapOperax.readRow (MapOperator.java:125) в org.apache.hadoop.hive.ql.exec.MapOperator $ MapOpCtx.access $ 200 (MapOperator.java:89) в org.apache.hadoop.hive.ql.exec.MapOperator.process (MapOperator.java:483) ... еще 9

1 Ответ

1 голос
/ 14 октября 2019

Есть несколько вещей, которые вы можете попробовать

  1. Я предполагаю, что столбец 3 имеет тип bigint в вашей новой таблице и строку в вашей старой таблице, которую вы можете разыграть и использовать на ней кола, что-то вродеcolaese (приведение (col3 как bigint), 0) в качестве col3 в вашем операторе select, попробуйте сделать то же самое для всех типов столбцов, приведенных к типу

  2. Попробуйте перезаписать вставку

Если вы можете запросить выбранную часть, значит, проблема с вставкой, пожалуйста, прокомментируйте ваши обновления, чтобы выяснить это

...