2016-09-29 46 views
0

我有一个75列和411274行的数据集,其中很多条目是nullNA我想用Data_not_available替换所有这些值是否有办法动态地执行此操作而不是输入每个列名来检查和更新数据?我不想使用类似于此的代码更新Hive中所有列的空值

SELECT * 
FROM table 
WHERE 1 = CASE 
     WHEN column1 is null OR column2 is null OR ..... OR columnN is null THEN 1 
     ELSE 0 
     END 

这消耗了很多时间。

回答

0

您可以使用regexp_replace UDF来执行您想要的操作。

regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT) 

返回从替换 INITIAL_STRING匹配的java正则表达式语法在图案限定 与REPLACEMENT的实例,所有的子串得到的字符串。例如, regexp_replace(“foobar”,“oo | ar”,“”)返回“fb”。请注意,在使用预定义的字符类时需要注意一些问题:使用'\ s'作为 第二个参数将匹配字母s; “\ S”是必要的 比赛的空白,等

所以你的情况,你可以使用类似:

SELECT 
    regexp_replace(column1, 'null|NA', 'Data_not_available') as column1, 
    column2, 
    column3, 
FROM table 
0

COALESCE和IF功能将帮助你动态地做到这一点。正如你所看到的那样,计算出来的投影(select)可以像你想要的那样工作。

create table test_3(field String); 
insert into test_3 values(null), ("NA"), ("A good value"); 

select * from test_3; 
+---------------+--+ 
| test_3.field | 
+---------------+--+ 
| NULL   | 
| NA   | 
| A good value | 
+---------------+--+ 

select if (coalesce(field, "NA") = "NA", "Data Not Available", field) from test_3; 
+---------------------+--+ 
|   _c0   | 
+---------------------+--+ 
| Data Not Available | 
| Data Not Available | 
| A good value  | 
+---------------------+--+