почему в Hive не работает логическое поле? - PullRequest
1 голос
/ 23 марта 2019

В моей таблице улья есть столбец, тип данных которого является логическим. когда я пытался импортировать данные из csv, они сохранялись как NULL.

Это мой пример таблицы:

CREATE tABLE if not exists Engineanalysis(

EngineModel String,

EnginePartNo String ,

Location String,

Position String,

InspectionReq boolean)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ','

LINES TERMINATED BY '\n';

Мои данные для примера:

AB01,AS01-IT01,AIRFRAME,,0

AB02,AS01-IT02,AIRFRAME,,1

AB03,AS01-IT03,AIRFRAME,,1

AB04,AS01-IT04,AIRFRAME,,1

AB05,AS01-IT05,HEAD,,1

AB06,AS01-IT06,HEAD,,0

AB07,AS01-IT07,HEAD,,0

AB08,AS01-IT08,HEAD,,0

AB09,AS01-IT09,NOSE,,1

AB10,AS01-IT10,NOSE,,0

Результат:

AB01 AS01-IT01 AIRFRAME NULL

AB02 AS01-IT02 AIRFRAME NULL

AB03 AS01-IT03 AIRFRAME NULL

AB04 AS01-IT04 AIRFRAME NULL

AB05 AS01-IT05 HEAD NULL

AB06 AS01-IT06 HEAD NULL

AB07 AS01-IT07 HEAD NULL

AB08 AS01-IT08 HEAD NULL

AB09 AS01-IT09 NOSE NULL

AB10 AS01-IT10 NOSE NULL

при загрузке вручную:

insert into Engineanalysis select 'AB11','AS01-IT11','AIRFRAME','',0;

Результат:

AB11 AS01-IT11 AIRFRAME false

Может кто-нибудь объяснить, почему это различие?

1 Ответ

3 голосов
/ 23 марта 2019

Булевому типу необходимо представление литералов. Стандарт SQL определяет только три значения для логического значения: TRUE, FALSE и UNKNOWN (= NULL в Hive). Использование целых чисел не стандартизировано в SQL, хотя многие базы данных поддерживают их.

Вы используете LazySimpleSerDe для десереализации данных таблицы. LazySimpleSerDe использует это свойство hive.lazysimple.extended_boolean_literal, чтобы определить, обрабатывает ли оно 'T', 't', 'F', 'f', '1' и '0' как расширенное , юридические логические литералы, в дополнение к «ИСТИНА» и «ЛОЖЬ». По умолчанию установлено значение false, что означает, что только «TRUE» и «FALSE» рассматриваются как допустимые логические литералы.

Установите это свойство, чтобы иметь возможность читать файлы CSV с 1 и 0 как логические значения:

hive.lazysimple.extended_boolean_literal=true;

См. Это Jira HIVE-3635 Попробуйте также установить это свойство в таблице DDL:

TBLPROPERTIES ("hive.lazysimple.extended_boolean_literal"="true")

Об использовании логических литералов, отличных от TRUE или FALSE, в официальной документации языка запросов Hive говорится, что неявное преобразование других типов в логические невозможно: AllowedImplicitConversions , хотя, как вы можете видеть, это работает.

Несколько тестов с приведением строк и целых чисел к логическим значениям:

hive> select cast('' as boolean);
OK
false
Time taken: 8.642 seconds, Fetched: 1 row(s)
hive> select cast('1' as boolean);
OK
true
Time taken: 4.773 seconds, Fetched: 1 row(s)
hive> select cast('f' as boolean);
OK
true
Time taken: 8.548 seconds, Fetched: 1 row(s)
hive> select cast('0' as boolean);
OK
true
Time taken: 0.851 seconds, Fetched: 1 row(s)
hive> select cast(0 as boolean);
OK
false
Time taken: 1.713 seconds, Fetched: 1 row(s)
hive> select cast(1 as boolean);
OK
true
Time taken: 4.604 seconds, Fetched: 1 row(s)

Также взгляните на этот Jira: HIVE-3604 и Функции преобразования типов Документация гласит: Если приведение (expr as boolean) Hive возвращает true для непустая строка. И на самом деле это соответствует UDFToBoolean исходному коду.

Итак, лучше используйте официально разрешенные литералы для логического типа, чтобы убедиться, что у вас нет побочных эффектов, также описанных в этой статье: Hive: Booleans слишком запутаны, чтобы их можно было использовать

...