Ошибка в работе 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