我的配置单元表中有一列的数据类型是布尔型的。当我尝试从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
有人能解释为什么这种不同吗?
1条答案
按热度按时间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
作为布尔值:请参阅jira hive-3635,并尝试在表ddl中设置此属性:
TBLPROPERTIES ("hive.lazysimple.extended_boolean_literal"="true")
关于在配置单元查询语言中使用非真布尔或假布尔文本官方文档说,其他类型到布尔的隐式转换是不可能的:allowedimplicitconversions,尽管您可以看到它是有效的。少数将字符串和整数转换为布尔值的测试:
还可以看看这个jira:hive-3604和类型转换函数文档,它说:if cast(expr as boolean)hive为非空字符串返回true。实际上这符合udftoboolean的源代码。
所以,最好对boolean类型使用官方允许的文本,以确保没有副作用,这篇文章中也描述了:hive:boolean太混乱了,无法使用