Почему логическое поле не работает в Hive?

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

может кто-нибудь объяснить, почему это непохожесть?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
9 382
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Krishnaraj Gunasekar 27.03.2019 07:22

Другие вопросы по теме