У меня есть столбец в моей таблице кустов, тип данных которого является логическим. когда я пытался импортировать данные из 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
может кто-нибудь объяснить, почему это непохожесть?


Логический тип нуждается в литеральном представлении. Стандарт SQL определяет только три значения для логического значения: TRUE, FALSE и UNKNOWN (= NULL в Hive). Использование целых чисел не стандартизировано в SQL, хотя многие базы данных поддерживают их.
Вы используете LazySimpleSerDe для десериализации данных таблицы.
LazySimpleSerDe использует это свойство hive.lazysimple.extended_boolean_literal, чтобы определить, обрабатывает ли он «T», «t», «F», «f», «1» и «0» как расширенные допустимые логические литералы в дополнение к «TRUE» и «FALSE». '. По умолчанию установлено значение false, что означает, что только «ИСТИНА» и «ЛОЖЬ» рассматриваются как допустимые логические литералы.
Установите это свойство, чтобы иметь возможность читать CSV-файлы с 1 и 0 как логические значения:
hive.lazysimple.extended_boolean_literal=true;
См. этот Jira УЛЕЙ-3635. Попробуйте также установить это свойство в таблице DDL:
TBLPROPERTIES ("hive.lazysimple.extended_boolean_literal" = "true")
Об использовании логических литералов, отличных от TRUE или FALSE, в официальной документации языка запросов Hive говорится, что неявное преобразование других типов в логические значения невозможно: Разрешенные неявные конверсии, хотя, как вы можете видеть, это работает.
Несколько тестов с приведением строк и целых чисел к логическим значениям:
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: УЛЕЙ-3604 и Функции преобразования типов, там написано: Если cast(expr as boolean) Hive возвращает true для непустой строки. И на самом деле это соответствует исходному коду UDFToBoolean.
Так что лучше используйте официально разрешенные литералы для логического типа, чтобы убедиться, что у вас нет побочных эффектов, также описанных в этой статье: Hive: Булевы значения слишком запутаны, чтобы их можно было использовать
привет @leftjin, спасибо за четкое объяснение. меня устраивает.