为什么布尔字段在配置单元中不起作用?

ie3xauqp  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(348)

我的配置单元表中有一列的数据类型是布尔型的。当我尝试从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

有人能解释为什么这种不同吗?

j1dl9f46

j1dl9f461#

布尔类型需要文本表示。sql标准只为boolean定义了三个值:true、false和unknown(=null)。使用整数在sql中不是标准化的,尽管许多数据库都支持整数。
您正在使用lazysimpleserde反序列化表数据。lazysimpleserde使用此属性 hive.lazysimple.extended_boolean_literal 确定是否将“t”、“t”、“f”、“f”、“1”和“0”视为扩展的合法布尔文字,以及“true”和“false”。默认值为false,这意味着只有“true”和“false”被视为合法的布尔文字。
将此属性设置为可以使用 1 以及 0 作为布尔值:

hive.lazysimple.extended_boolean_literal=true;

请参阅jira hive-3635,并尝试在表ddl中设置此属性: TBLPROPERTIES ("hive.lazysimple.extended_boolean_literal"="true") 关于在配置单元查询语言中使用非真布尔或假布尔文本官方文档说,其他类型到布尔的隐式转换是不可能的: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和类型转换函数文档,它说:if cast(expr as boolean)hive为非空字符串返回true。实际上这符合udftoboolean的源代码。
所以,最好对boolean类型使用官方允许的文本,以确保没有副作用,这篇文章中也描述了:hive:boolean太混乱了,无法使用

相关问题