我在配置单元中有一个表,其中包含以“null”作为数据的colun。我想用'n/a'替换'null',尝试使用coalesce(col\u name,'n/a'),但它不起作用,我使用if,它起作用了
if(col_name='null','N/A',col_name)
我在列中有数百万个值,这个'if'会影响性能吗?如果是的话,处理这种情况的最佳方法是什么?好心的建议
dtcbnfnu1#
我怀疑您的列不是真正的空值(即没有值),而是字符串等于“null”。也许这就是从源系统加载数据的方式?如果这是真的,那么 COALESCE(col_name,'N/A') 函数总是返回col\u name的值,因为这是函数中列出的第一个非空值。尝试以下查询:
COALESCE(col_name,'N/A')
SELECT COUNT(*) FROM table_name WHERE col_name IS NULL;
这将显示列是否实际具有空值,如配置单元所配置的那样。请注意,您可以通过使用以下内容覆盖默认的null行为来更改配置单元的行为:
ALTER table_name SET TBLPROPERTIES('serialization.null.format'='your_value')
另请注意,如果您有一个分区表,则必须在每个分区定义上使用上面的set语句-分区将不使用表级设置。
waxmsbnn2#
使用if条件不会影响你的表现。无论您选择什么条件函数(case、nvl、if等),它都需要遍历所有记录来检查该条件。如果条件允许,请继续使用
2条答案
按热度按时间dtcbnfnu1#
我怀疑您的列不是真正的空值(即没有值),而是字符串等于“null”。也许这就是从源系统加载数据的方式?
如果这是真的,那么
COALESCE(col_name,'N/A')
函数总是返回col\u name的值,因为这是函数中列出的第一个非空值。尝试以下查询:
这将显示列是否实际具有空值,如配置单元所配置的那样。
请注意,您可以通过使用以下内容覆盖默认的null行为来更改配置单元的行为:
另请注意,如果您有一个分区表,则必须在每个分区定义上使用上面的set语句-分区将不使用表级设置。
waxmsbnn2#
使用if条件不会影响你的表现。无论您选择什么条件函数(case、nvl、if等),它都需要遍历所有记录来检查该条件。如果条件允许,请继续使用