配置单元查询给出了错误的结果,因为条件不为空且有很多或条件

hive queries is giving wrong result for a condition is not null with many or conditions

我需要排除在 hive managed table 中少数指定列中所有具有空值的行。 什么时候将 "col is not null" 或 "not isdbnull(col)" 与一列或两列一起使用时效果很好。但是我需要检查很多col,所以当在查询中添加更多或条件时,它会忽略空条件并给出所有行。

我决定了解原因,我得出的结论是,如果所有列同时为空,将给出正确的 select 结果。如果任何 isdbnull(col) 条件失败,将包括所有仍然具有空值并在查询中指定的行或条件。

非常感谢任何线索。

您提到您在查询中使用 "or" 而不是 "and"。所以你做了“(not A) or (Not B)”,这相当于 "not (A and B)"。这将要求两者都为空。这与 "not (A or B)" 不同,后者与“(not A) and (not B)”相同,这就是我在下面编写查询的方式。请参阅 De Morgans 定律以获得进一步的解释。

如果您想要 select 所有具有非空值的行,请执行此操作:

 select col1, col2, col3 from table
 where col1 is not null and col2 is not null and col3 is not null;

此外,如果您将空字符串构造为空值,那么您可以:

Select col1 .... where col1 != '';

我看到有人也这样做:

Select col1 .... where length(col1) > 0;

Hive 如何理解空值? Hive 将空字符串解释为空,而不是 NULL。空字符串对应用程序的含义可能与 NULL 不同,因此它们的解释不同。

加载数据时,默认缺失值由特殊值 NULL 表示。要导入带有 NULL 字段的数据,请查看 table 使用的 SerDe 文档。默认文本格式使用 LazySimpleSerDe,它在导入时将字符串 \N 解释为 NULL。这意味着您应该在加载配置单元时将 \N 作为值来表示空值。

您可以在创建 table 时修改此 ("serialization.null.format"="") 以让配置单元知道您有一些其他值来表示 null。在此处的示例中,您可以看到它被设置为“”以表示空值。

祝你好运!