hive查询给出了错误的结果,条件不是空的,有很多或条件

时间:2015-07-15 19:19:15

标签: hive

我需要在hive托管表中的少数指定列中排除所有具有null的行。 何时使用" col不为空"或者"不是isdbnull(col)"有一两列它工作正常。但是我需要检查很多col,所以当在查询中添加更多或条件时,它会忽略null条件并给出所有行。

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

任何线索都非常感激。

1 个答案:

答案 0 :(得分:1)

你提到你使用了"或"而不是"和"在您的查询中。所以你做了#34;(不是A)或(不是B)"这相当于"不是(A和B)"。这将要求两者都为空。这与"不是(A或B)"与"(不是A)和(不是B)"相同这是我写下面的查询的方式。有关进一步解释,请参阅De Morgans法律。

如果要选择所有非空值的行,请执行以下操作:

 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的含义,因此它们的解释方式不同。

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

您可以在创建表时修改此(" serialization.null.format" =""),让hive知道您有其他值来表示null。在这种情况下,你可以看到它被设置为""对于空值。

祝你好运!