在Hive中动态更新所有列的空值

时间:2016-09-29 20:33:40

标签: hadoop hive multiple-columns updates

我有一个包含75列和411274行的数据集,其中许多条目都是nullNA我想用Data_not_available替换所有这些值有没有办法动态而不是输入每个列名来检查和更新数据?我不想使用与此类似的代码

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

这耗费了很多时间。

2 个答案:

答案 0 :(得分:0)

您可以使用regexp_replace UDF执行所需的操作。

regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)
  

返回替换所有子串的结果   与定义的java正则表达式语法匹配的INITIAL_STRING   在PATTERN中使用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

答案 1 :(得分:0)

COALESCE和IF功能将帮助您动态完成。正如您所见,计算投影(选择)可以按预期工作。

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        |
+---------------------+--+