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)
有人可以解释为什么会有这种不同吗?
布尔类型需要文字表示。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' 被视为合法的布尔文字。
将此属性设置为能够使用布尔值1和0布尔值读取 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