【发布时间】:2016-12-15 18:43:43
【问题描述】:
我在 hive 中有一个表,其中包含以“null”作为数据的列。 我想用 'N/A' 替换 'null' 尝试使用 COALESCE(col_name,'N/A') 但它不起作用 我使用了 if 并且成功了
if(col_name='null','N/A',col_name)
我在列中有数百万个值,这个“如果”会影响性能吗?如果是,那么处理这种情况的最佳方法是什么?
请推荐
【问题讨论】:
我在 hive 中有一个表,其中包含以“null”作为数据的列。 我想用 'N/A' 替换 'null' 尝试使用 COALESCE(col_name,'N/A') 但它不起作用 我使用了 if 并且成功了
if(col_name='null','N/A',col_name)
我在列中有数百万个值,这个“如果”会影响性能吗?如果是,那么处理这种情况的最佳方法是什么?
请推荐
【问题讨论】:
使用 IF 条件不会影响您的性能。无论您选择什么条件函数(CASE、NVL、IF 等),它都需要遍历所有记录以检查该条件。继续使用 IF 条件
【讨论】:
我怀疑您的列不是真正的 NULL 值(即没有值),而是字符串等于“null”。也许这就是从源系统加载数据的方式?
如果是这样,那么COALESCE(col_name,'N/A') 函数将始终返回 col_name 的值,因为这是函数中列出的第一个非 NULL 值。
尝试如下查询:
SELECT COUNT(*) FROM table_name WHERE col_name IS NULL;
这将显示该列是否实际上具有 NULL 值,如您已配置的 Hive。
请注意,您可以通过覆盖默认的 NULL 行为来更改 Hive 的行为:
ALTER table_name SET TBLPROPERTIES('serialization.null.format'='your_value')
另请注意,如果您有分区表,则必须在每个分区定义上使用上述 SET 语句 - 分区不会使用表级设置。
【讨论】: