Hive: тип столбца Decimal (12,9) создает исключение NullPointerException с JSONSerDe

У меня есть внешняя таблица, которая указывает на данные json. Я использую serde org.apache.hive.hcatalog.data.JsonSerDe.
Я создал представление поверх этой внешней таблицы с помощью DDL:

CREATE VIEW `my_table` AS SELECT
a.col1,
a.col2,
...
...
a.longitude,
a.latitude
FROM
(SELECT
mytable.body.col1,
mytable.body.col2,
....
..
mytable.body.longitude,
mytable.body.latidute,
ROW_NUMBER() OVER( PARTITION BY mytable.body.col1, mytable.body.col1 ORDER BY mytable.body.col3 DESC )
AS rownum FROM mydb.myExtTable) AS a where a.rownum=1

Когда я делаю SELECT * FROM mytable, это дает мне NullPointerException:

Vertex failed, vertexName=Reducer 2, vertexId=vertex_1529530522022_75616_22_01, diagnostics=[Task failed, taskId=task_1529530522022_75616_22_01_000000, diagnostics=[TaskAttempt 0 failed, info=[Error: Failure while running task:java.lang.RuntimeException: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row (tag=0) [Error getting row data with exception java.lang.NullPointerException
        at org.apache.hadoop.hive.serde2.lazybinary.LazyBinaryHiveDecimal.init(LazyBinaryHiveDecimal.java:47)
        at org.apache.hadoop.hive.serde2.lazybinary.LazyBinaryStruct.uncheckedGetField(LazyBinaryStruct.java:267)
        at org.apache.hadoop.hive.serde2.lazybinary.LazyBinaryStruct.getField(LazyBinaryStruct.java:204)
        at org.apache.hadoop.hive.serde2.lazybinary.objectinspector.LazyBinaryStructObjectInspector.getStructFieldData(LazyBinaryStructObjectInspector.java:64)
        at org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:354)
        at org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:354)
        at org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:354)
        at org.apache.hadoop.hive.serde2.SerDeUtils.getJSONString(SerDeUtils.java:198)
        at org.apache.hadoop.hive.serde2.SerDeUtils.getJSONString(SerDeUtils.java:184)
        at org.apache.hadoop.hive.ql.exec.tez.ReduceRecordSource$GroupIterator.next(ReduceRecordSource.java:347)
        at org.apache.hadoop.hive.ql.exec.tez.ReduceRecordSource.pushRecord(ReduceRecordSource.java:274)
        at org.apache.hadoop.hive.ql.exec.tez.ReduceRecordProcessor.run(ReduceRecordProcessor.java:266)
        at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:150)
        at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:139)
        at org.apache.tez.runtime.LogicalIOProcessorRuntimeTask.run(LogicalIOProcessorRuntimeTask.java:347)
        at org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable$1.run(TezTaskRunner.java:194)
        at org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable$1.run(TezTaskRunner.java:185)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1866)
        at org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable.callInternal(TezTaskRunner.java:185)
        at org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable.callInternal(TezTaskRunner.java:181)
        at org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
 ]
        at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:173)
        at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:139)
        at org.apache.tez.runtime.LogicalIOProcessorRuntimeTask.run(LogicalIOProcessorRuntimeTask.java:347)
        at org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable$1.run(TezTaskRunner.java:194)
        at org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable$1.run(TezTaskRunner.java:185)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1866)
        at org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable.callInternal(TezTaskRunner.java:185)
        at org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable.callInternal(TezTaskRunner.java:181)
        at org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

У меня всего 2 записи в формате JSON.
Два JSON выглядят так:

{"header": {"header1":"value1", "header2": "value2"}, "body": {"col1": "col1 value", "col2": "col2 value",.... "latitude": 39.921302, "longitude": -74.879928}}
{"header": {"header1":"value1", "header2": "value2"}, "body": {"col1": "col1 value", "col2": "col2 value",.... "latitude": 43658734.438, "longitude": 3453.3453}} 

Странная часть заключается в том, что когда я запускаю SELECT в своем VIEW, используя только 1 запись, он правильно извлекает меня, но запуская его для обеих записей вместе, он дает мне исключение.

Когда я удаляю значения "latitude": 43658734.438, "longitude": 3453.3453 из данных JSON (из 2-й записи), все снова работает нормально.
Столбцы longitude и latitude имеют тип decimal(12,9).
Как я подозреваю, есть ли какие-либо проблемы со столбцом value ?
Но если значения создают проблему при совместном запуске обеих записей, почему они работают нормально по отдельности (Примечание: при отдельном запуске 2-й записи эти два значения столбца для этой записи заменяются на NULL).< br> В чем может быть дело?

Пожалуйста помоги.


person aiman    schedule 11.07.2018    source источник


Ответы (1)


Проверьте определение https://www.cloudera.com/documentation/enterprise/5-8-x/topics/impala_decimal.html

decimal(12,9) означает 12 цифр с 9 цифрами после запятой, поэтому 3 цифры до. похоже, вам нужно как минимум decimal(14,6) здесь

person Harold    schedule 11.07.2018
comment
Спасибо, Гарольд. Это было полезно. Для "latitude": 43658734.438 мне нужно сделать его десятичным (18,9) - person aiman; 11.07.2018