【问题标题】:why boolean field is not working in Hive?为什么布尔字段在 Hive 中不起作用?
【发布时间】:2019-08-14 07:45:25
【问题描述】:

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

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

【问题讨论】:

    标签: sql hive boolean bigdata hiveql


    【解决方案1】:

    布尔类型需要文字表示。 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;
    

    看到这个 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)
    

    还可以看看这个 Jira:HIVE-3604Type Conversion Functions 文档,它说:如果 cast(expr as boolean) Hive 为非空字符串返回 true。 实际上这个符合UDFToBoolean源代码。

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

    【讨论】:

    • 嗨@leftjin,感谢您的明确解释。它对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2021-09-14
    • 1970-01-01
    • 2021-01-08
    相关资源
    最近更新 更多