Hive sql使用小结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BAStriver/article/details/85115853

1.首先,很多时我们需要在Hive中去重数据:(语法和Oracle中的去重很类似,子查询更名为 t 这个不能省略)

select  ID, CASE_ID_
from (
 SELECT 
 ID, CASE_ID_ , row_number() OVER(PARTITION BY CASE_ID_ ) as row_flg   

 FROM table

)t where t.row_flg=1 

2.对某一个存储手机号码的zidu字段进行过滤区号可以这样(记得是\\+86 而不是 +86,+属于特殊字符):

 SELECT  ID, CASE_ID_, 
 regexp_replace(regexp_replace(regexp_replace(regexp_replace(TO_ACCOUNT_,'\\+86', ''),'\\+85', ''),'-', ''),' ', '') AS TO_ACCOUNT_

 FROM table

当然,使用正则去掉会更好:

 SELECT  ID, CASE_ID_, 
 regexp_replace(regexp_replace(regexp_replace(TO_ACCOUNT_,'(\\+\\d{2})?', ''),'-', ''),' ', '') AS TO_ACCOUNT_

 FROM table

-- 参考:(去除区号) https://blog.csdn.net/wmx690/article/details/80354321
-- (去除http url) https://blog.csdn.net/abauch_d/article/details/7837089
-- 注:去除url那个正则不太全面,只能去除 http://ip,端口号之后的内容不能去除

3. 对于某一个存储可能会有 \t \s 等字符的字段,可以这样过滤:

 SELECT  ID, CASE_ID_, 
 regexp_replace(CONTENT, '\\s+', '')
 FROM table

4.对于某两个字段是互补的情况可以这样:

 SELECT  ID, CASE_ID_, 
  CASE WHEN TIME like '20___%__%_ %_:%_:%_' THEN TIME_ ELSE TIME1 END,
 FROM table

5 创建表可以这样:

CREATE TABLE test(
APP_ID_ STRING,
CASE_ID_ STRING
)ROW FORMAT DELIMITED fields terminated BY '\t' STORED AS TEXTFILE;

6.当某一个字段的值以某一个字符 如: ";" ,我们想取出 ";" 前的内容可以进行切割字符串:

 SELECT  ID, CASE_ID_, 
 split('192.168.0.1','\\.')
 FROM table

-- 当split包含在 "" 之中时 需要加4个\,如 hive -e "....  split('192.168.0.1','\\\\.') ... "  不然得到的值是null

 7.如6所说的,当我们使用 hive -e "..." 并且在java代码中执行hive sql的时候,原本是\\ 的要写成 \\\\ ,不然会报错,而 sql语句中的引号最好用单引号 ' 

参考:https://blog.csdn.net/lsr40/article/details/81566424

8. 具体参考 Hive sql 的 官网api :http://trafodion.apache.org/docs/sql_reference/#examples_of_substring

猜你喜欢

转载自blog.csdn.net/BAStriver/article/details/85115853