我需要在hive托管表中的少数指定列中排除所有具有null的行。 何时使用" col不为空"或者"不是isdbnull(col)"有一两列它工作正常。但是我需要检查很多col,所以当在查询中添加更多或条件时,它会忽略null条件并给出所有行。
我决定理解原因,我得出的结论是,如果所有列具有相同时间的空值将给出正确的选择结果。如果任何isdbnull(col)条件失败,则将包括仍具有空值并在查询中使用或条件指定的所有行。
任何线索都非常感激。
答案 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。在这种情况下,你可以看到它被设置为""对于空值。
祝你好运!