Ошибка в работе hadoop из-за ошибки запроса куста
Исключение:
2017-06-21 22:47:49,993 FATAL ExecMapper (main): org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing writable [email protected]
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:643)
at org.apache.hadoop.hive.ql.exec.ExecMapper.map(ExecMapper.java:149)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:441)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:377)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1132)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: java.lang.RuntimeException: Exception while processing record: [email protected]
at org.apache.hadoop.hive.dynamodb.DynamoDBObjectInspector.getColumnData(DynamoDBObjectInspector.java:136)
at org.apache.hadoop.hive.dynamodb.DynamoDBObjectInspector.getStructFieldData(DynamoDBObjectInspector.java:97)
at org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters$StructConverter.convert(ObjectInspectorConverters.java:328)
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:626)
... 9 more
Caused by: java.lang.NumberFormatException: For input string: "17664956244983174066"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:444)
at java.lang.Long.parseLong(Long.java:483)
at org.apache.hadoop.hive.dynamodb.DynamoDBDataParser.getNumberObject(DynamoDBDataParser.java:179)
at org.apache.hadoop.hive.dynamodb.type.HiveDynamoDBNumberType.getHiveData(HiveDynamoDBNumberType.java:28)
at org.apache.hadoop.hive.dynamodb.DynamoDBObjectInspector.getColumnData(DynamoDBObjectInspector.java:128)
... 12 more
Я отправляю запрос куста:
INSERT OVERWRITE TABLE temp_1
SELECT * FROM temp_2
WHERE t_id="17664956244983174066" and t_ts="636214684577250000000";
Является ли этот номер слишком большим для преобразования в int? Я даже попытался отправить 17664956244983174066
без кавычек, но я получаю то же исключение.
t_id
определяется как BIGINT
в hive table
и N
или Number в dynamobd
EDIT:
Я попытался определить t_id
как string
== > Schema mismatch as dynamodb stores this as int
t_id
как double
== → precision lost. no match.
Каким может быть решение?
Ответы
Ответ 1
Решение, как сказано людьми AWS, заключается в
- git клон с открытым исходным кодом emr-dynamodb-connector
- изменить код
- подготовьте свою собственную банку
- Использование загрузчика загружает его в EMR
- В run_job_flow отправьте конфигурации для
hadoop env
, добавив ваше собственное расположение баннеров в HADOOP_CLASSPATH
.
Будучи не столько в Java, но и модификация emr-dynamodb-соединителя была невозможна, но это решение. Также можно сделать 2 вещи... если вы не используете Strings
в dynamodb, map string
от hive
до number
от dynamodb, иначе добавьте отображение и поддержку для decimal
от улья до dynamodb number
Ответ 2
Является ли этот номер слишком большим для преобразования в int?
Да, это число слишком велико, чтобы преобразовать в интегральный тип. Согласно документации Apache Hive на Числовые типы, максимальное значение для BIGINT
равно 9223372036854775807. Ваш вход, 17664956244983174066, больше, чем это.
Ниже приведен ванильный запрос куста (без интеграции DynamoDB), демонстрирующий эффекты попыток преобразования различных входов в BIGINT
.
SELECT
"9223372036854775807" AS str,
cast("9223372036854775807" AS BIGINT) AS numbigint,
cast("9223372036854775807" AS DOUBLE) AS numdouble
UNION ALL
SELECT
"9223372036854775808" AS str,
cast("9223372036854775808" AS BIGINT) AS numbigint,
cast("9223372036854775808" AS DOUBLE) AS numdouble
UNION ALL
SELECT
"17664956244983174066" AS str,
cast("17664956244983174066" AS BIGINT) AS numbigint,
cast("17664956244983174066" AS DOUBLE) AS numdouble
;
str numbigint numdouble
0 9223372036854775807 9223372036854775807 9.2233720368547758e+18
1 9223372036854775808 NULL 9.2233720368547758e+18
2 17664956244983174066 NULL 1.7664956244983173e+19
При документированном максимальном значении BIGINT
значение преобразуется правильно. При уровне 1 выше преобразование завершается неудачно, в результате получается NULL
. То же самое происходит и для вашего ввода.
В запросе также показано, что преобразование в DOUBLE
выполнено успешно. Возможно, это решение, в зависимости от вашего варианта использования. По сравнению с интегральным типом данных это может открыть риск столкновения с проблемами точности с плавающей запятой.
Из вашей трассировки стека кажется, что интеграция DynamoDB приводит к NumberFormatException
для этого случая, а не к NULL
. Вероятно, это ошибка в разъем DynamoDB, но даже если она была изменена для отображения на NULL
, вы все равно не получили бы успешного преобразования.
Ответ 3
Ваши цифры вне диапазона для bigint.
Определите все как строку в обеих сторонах.
Ответ 4
Согласно https://www.tutorialspoint.com/hive/hive_data_types.htm, тип DECIMAL будет работать для вас.
Тип DECIMAL в Hive такой же, как формат Big Decimal Java. Он используется для представления неизменной произвольной точности. Синтаксис и пример:
DECIMAL(precision, scale)
decimal(10,0)
Ответ 5
Я не использовал EMR, но здесь идет мое предположение:)
Hive автоматически пытается преобразовать ваш вход, потому что ваше целевое поле - BigInt, вы попробовали что-то вроде этого?
INSERT OVERWRITE TABLE temp_1
SELECT * FROM temp_2
WHERE cast(t_id as string)="17664956244983174066" and cast(t_ts as string)="636214684577250000000";
Основываясь на моем опыте, это должно избегать внесения вашего ввода, однако вы можете получить исключения, вставленные в новую таблицу, вы можете создавать свои поля во время выбора, если у вас слишком много столбцов, вы также можете попробовать это
https://community.hortonworks.com/info/7703/whether-hive-supports-hive-select-all-query-with-e.html