为什么布尔字段在 Hive 中不起作用?

Kri*_*kar 2 sql hive boolean bigdata hiveql

我的配置单元表中有一个数据类型为布尔值的列。当我尝试从 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';
Run Code Online (Sandbox Code Playgroud)

我的样本数据:

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
Run Code Online (Sandbox Code Playgroud)

结果 :

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
Run Code Online (Sandbox Code Playgroud)

手动加载时:

insert into Engineanalysis select 'AB11','AS01-IT11','AIRFRAME','',0;
Run Code Online (Sandbox Code Playgroud)

结果:

AB11 AS01-IT11 AIRFRAME false
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么会有这种不同吗?

lef*_*oin 5

布尔类型需要文字表示。SQL 标准仅定义了三个布尔值:TRUE、FALSE 和 UNKNOWN(Hive 中为 =NULL)。在 SQL 中使用整数不是标准化的,尽管许多数据库支持它们。

您正在使用 LazySimpleSerDe 来反实现表数据。 LazySimpleSerDe使用此属性hive.lazysimple.extended_boolean_literal来确定它是否将 'T'、't'、'F'、'f'、'1' 和 '0' 视为扩展的合法布尔文字,以及 'TRUE' 和 'FALSE' . 默认值为 false,这意味着只有 'TRUE' 和 'FALSE' 被视为合法的布尔文字。

将此属性设置为能够使用布尔值10布尔值读取 CSV 文件:

hive.lazysimple.extended_boolean_literal=true;
Run Code Online (Sandbox Code Playgroud)

请参阅此 Jira HIVE-3635也尝试在表 DDL 中设置此属性:

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

关于在 Hive 查询语言官方文档中使用 TRUE 或 FALSE 以外的布尔文字,不能将其他类型隐式转换为布尔值: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)
Run Code Online (Sandbox Code Playgroud)

也看看这个 Jira:HIVE-3604类型转换函数文档,它说: 如果 cast(expr as boolean) Hive 为非空字符串返回 true。实际上这符合UDFToBoolean源代码。

因此,最好使用官方允许的 Boolean 类型文字,以确保没有本文中描述的副作用:Hive:Booleans Are Too Confusing To Be Usable