Я создал таблицу Hive (3.1.2) из дампа файла BSON из MongoDB (4.0). После создания таблицы я выбираю пару записей из таблицы. Однако некоторые из них имеют значение null.
Я попытался распечатать строку таблицы из BSON с помощью python. Он напечатал значения правильно. Означает, что значение не отсутствует. Любая подсказка о том, как дальше устранять неполадки?
SQL для создания таблицы кустов.
CREATE EXTERNAL TABLE `tmp_test_status`(
`id` string COMMENT 'frame_id',
`createdAt` INT,
`updatedAt` string,
`task` string)
row format serde 'com.mongodb.hadoop.hive.BSONSerDe'
with serdeproperties('mongo.columns.mapping'='{"id":"_id"}')
stored as inputformat 'com.mongodb.hadoop.mapred.BSONFileInputFormat'
outputformat 'com.mongodb.hadoop.hive.output.HiveBSONFileOutputFormat'
LOCATION
'oss://data-warehouse/hive/warehouse/data.db/tmp_test_status';
===========================================
Данные, которые я напечатал с помощью python bson lib.
{'_id': '00003a02-280d-4e59-8483-a0143e0a3359', 'createdAt': '1557999191951', 'updatedAt': '1557999191951', 'task': 'lane', '__v': 0}
===========================================
Данные, которые я выбрал из таблицы Hive:
00003a02-280d-4e59-8483-a0143e0a3359 NULL NULL lane
093e72ae-206b-4112-ac28-5ba38f9485d0 NULL NULL lane
093ebe41-183c-47b4-ab25-93336875ae10 NULL NULL lane
093ec16b-ba1d-4ddc-90bc-9981342e8071 NULL NULL lane
Я нашел ответ самостоятельно, причина в том, что имя атрибута файла BSON различает нижний и верхний регистр, а Hive - нет. Если имя атрибута содержит верхний регистр в файле BSON, то Hive вернет NULL при запросе. Просто сопоставьте имя атрибута с помощью свойств таблицы, которые мне помогли.
with serdeproperties('mongo.columns.mapping'='{"id":"_id", "createdAt": "createdAt", "updatedAt": "updatedAt", "reLabeled1" : "reLabeled1", "isValid": "isValid"}')