我有一个75列和411274行的数据集,其中许多条目是null
或NA
,我想用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
这会消耗很多时间。
您可以使用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
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 |
+---------------------+--+