Cloudera中变量值转换与属性重命名技术咨询
在Cloudera中实现需求的两种方案
针对你要把call_15_second的Null转0、1转15(数值型)或'15secs'(字符型)的需求,在Cloudera常用的Hive SQL环境里,可以这样实现:
方案1:转换为数值型15(便于后续计算)
这种场景适合需要基于转换后的值做求和、统计等数值计算的情况,我们可以结合CASE WHEN或IF函数,同时处理Null和1的转换:
写法一:使用CASE WHEN(可读性更强)
SELECT sum( CASE WHEN call_15_second IS NULL THEN 0 -- 把Null转为0 WHEN call_15_second = 1 THEN 15 -- 把1转为15 ELSE call_15_second -- 保留原来的0值 END ) AS call_15_second FROM your_table_name;
写法二:使用IF函数(更简洁)
利用COALESCE先把Null转为0,再用IF判断是否为1来替换:
SELECT sum(IF(COALESCE(call_15_second, 0) = 1, 15, COALESCE(call_15_second, 0))) AS call_15_second FROM your_table_name;
方案2:转换为字符型'15secs'(用于展示场景)
如果是需要将单条记录的1转为'15secs',注意字符型无法直接做sum运算,所以分两种情况:
情况一:单条记录转换(不做求和)
SELECT CASE WHEN call_15_second IS NULL THEN '0' WHEN call_15_second = 1 THEN '15secs' ELSE CAST(call_15_second AS STRING) -- 把原0值转为字符串'0' END AS call_15_second_display FROM your_table_name;
情况二:先求和再转字符展示
如果需要先基于数值15完成求和计算,再转为带单位的字符:
SELECT CONCAT( CAST( sum( CASE WHEN call_15_second IS NULL THEN 0 WHEN call_15_second = 1 THEN 15 ELSE call_15_second END ) AS STRING ), 'secs' ) AS call_15_second_total FROM your_table_name;
替换上述代码中的your_table_name为你的实际表名即可,这些写法在Cloudera的Hive环境中都是完全兼容的。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

