【问题标题】:Expression "IS NOT NULL" not working on HQL表达式“IS NOT NULL”不适用于 HQL
【发布时间】:2016-05-19 12:34:18
【问题描述】:

当我对 hive 表上的非空值执行 select 语句时,响应中没有正确的结果。结果好像没有“is not null”表达式!

示例

select count(*)
from test_table
where test_col_id1='12345' and test_col_id2 is not null;

注意test_col_id1test_col_id2 不是分区键。

这是我的蜂巢版本。

Hive 0.14.0.2.2.0.0-2041

这是桌子:

... | test_col_id1 | test_col_id2 |
... | 12345 | x |
... | 12345 |空 |

此查询返回 2 条记录。

【问题讨论】:

  • 您使用的是哪种 SerDe:Text、Sequence、AVRO、Parquet、ORC?当您选择一个您认为为 Null 的行时,它会显示为“null”还是空字符串?
  • Hive 的哪个版本?使用 TEZ (哪个版本) 或普通 MapReduce?
  • 我正在从命令行进行查询。当我查询记录时,我在命令行上看到一个 NULL

标签: null hive hql


【解决方案1】:

试试下面的查询,它会返回行吗?

select count(*)
from test_table
where test_col_id1='12345' and test_col_id2 != 'NULL';

那么你的NULL 不是NULL,它是字符串'NULL'。很多人在使用 Hive 处理 NULL 字符串时遇到问题。默认情况下,它是空白字符串''。如果我们想要其他任何东西,我们必须在创建表时准确指定处理 NULL 字符串的方式。以下是 3 个示例,说明如何更改识别为 NULL 的内容。第一个将'NULL'字符串设置为NULL

CREATE TABLE nulltest1 (id STRING, another_string STRING)
TBLPROPERTIES('serialization.null.format'='NULL') --sets the string 'NULL' as NULL;
CREATE TABLE nulltest2 (id STRING, another_string STRING)
TBLPROPERTIES('serialization.null.format'='') --sets empty string as NULL;
CREATE TABLE nulltest3 (id STRING, another_string STRING)
TBLPROPERTIES('serialization.null.format'='\N'); --sets \N as NULL;

由于您已经创建了表格,您可以更改表格,使其将您的'NULL' 识别为NULL

ALTER TABLE test_table SET TBLPROPERTIES ('serialization.null.format' = 'NULL');

【讨论】:

    【解决方案2】:

    Hive 以不同的方式解析 NULL 值。

    Hive 不认为空值是 NULL。但是,默认情况下,Hive 使用\N 来表示 NULL(不是特殊字符,只是反斜杠加大写字母 N)。 如果只想过滤掉所有空值,可以使用

    where test_col_id2 != ''

    如果您在加载到 hive 表中的原始文本文件中使用真正的 NULL 值,您可以尝试

    where test_col_id2 != '\000'

    因为八进制中NULL的ASCII码是00,第一个“0”表示它是一个八进制数。

    顺便说一句,你也可以使用命令:

    alter table $YOUR_TABLE SETSERDEPROPERTIES('serialization.null.format' ='abc')
    

    如果您希望 Hive 将“abc”解析为某个表的 NULL 值,则将 NULL 值自定义为“abc”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多