hive中 常用操作

Posted 数据咖啡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive中 常用操作相关的知识,希望对你有一定的参考价值。

本篇文章主要介绍一下hive的常用sql 操作

  1. 添加分区

    一次添加一个分区

 
   
   
 
  1.    ALTER TABLE table_name ADD PARTITION (partCol = 'value1') location 'loc1'; //示例

  2.    ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (dt='20130101') LOCATION '/user/hadoop/warehouse/table_name/dt=20130101'; //一次添加一个分区

一次添加多个分区

 
   
   
 
  1. ALTER TABLE $abc$ ADD IF NOT EXISTS PARTITION(p_provincecode=$abc.p_provincecode$,p_year=$abc.p_year$,p_month=$abc.p_month$) LOCATION '/hadoop路径/p_provincecode=$abc.p_provincecode$/p_year=$abc.p_year$/p_month=$abc.p_month$/'

  2. ALTER TABLE page_view ADD PARTITION (dt='2008-08-08', country='us') location '/path/to/us/part080808' PARTITION (dt='2008-08-09', country='us') location '/path/to/us/part080809';  //

  1. 删除分区

 
   
   
 
  1. ALTER TABLE login DROP IF EXISTS PARTITION (dt='2008-08-08');

  2. ALTER TABLE page_view DROP IF EXISTS PARTITION (dt='2008-08-08', country='us');

  1. 修改分区

 
   
   
 
  1. ALTER TABLE table_name PARTITION (dt='2008-08-08') SET LOCATION "new location";

  2. ALTER TABLE table_name PARTITION (dt='2008-08-08') RENAME TO PARTITION (dt='20080808');

  1. 添加列(字段)

 
   
   
 
  1. ALTER TABLE table_name ADD COLUMNS (col_name STRING);  //在所有存在的列后面,但是在分区列之前添加一列

  1. 修改列

 
   
   
 
  1. CREATE TABLE test_change (a int, b int, c int);

  2. /* will change column a's name to a1*/

  3. ALTER TABLE test_change CHANGE a a1 INT;

  1. hive删除字段

 
   
   
 
  1. ALTER TABLE wireless_union_data_export_part1 REPLACE COLUMNS();

7.修改表属性

 
   
   
 
  1. alter table table_name set TBLPROPERTIES ('EXTERNAL'='TRUE');  //内部表转外部表

  2. alter table table_name set TBLPROPERTIES ('EXTERNAL'='FALSE');  //外部表转内部表

8.表的重命名

 
   
   
 
  1. ALTER TABLE table_name RENAME TO new_table_name

  2. gbase修改字段只能先删掉字段,然后再添加

  3. gbase删除字段

  4. alter table table_name drop 字段名

  5. gbase添加字段

  6. alter table table_name add COLUMN col_name STRING;

  7. gbase清除表数据不删除表

  8. delete 表名

  9. drop 表名

  1. 导入数据

 
   
   
 
  1. load data local inpath '/home/hadoop/ip.txt' [OVERWRITE] into table tab_ext;

  1. external表

EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。

为了避免源文件丢失的问题,可以建立external表,数据源可以在任意位置。

 
   
   
 
  1. CREATE EXTERNAL TABLE tab_ip_ext(id int, name string,

  2.     ip STRING,

  3.     country STRING)

  4. ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

  5. STORED AS TEXTFILE

  6. LOCATION '/external/hive';

在创建表的时候,就指定了HDFS文件路径,因此,源文件上传到/external/hive/文件夹即可。

外部表删除时,只删除元数据信息,存储在HDFS中的数据没有被删除。

  1. 分桶表

Hive里的分桶=MapReduce中的分区,而Hive中的分区只是将数据分到了不同的文件夹。

 
   
   
 
  1. create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdept string)

  2. clustered by(Sno)

  3. sorted by(Sno DESC)

  4. into 4 buckets

  5. row format delimited

  6. fields terminated by ',';

一般不适用load数据进入分桶表,因为load进入的数据不会自动按照分桶规则分为四个小文件。所以,一般使用select查询向分桶表插入文件。

设置变量,设置分桶为true, 设置reduce数量是分桶的数量个数

 
   
   
 
  1. set hive.enforce.bucketing = true;

  2. set mapreduce.job.reduces=4;

  3. insert overwrite table student_buck

  4. select * from student cluster by(Sno);

  5. insert overwrite table stu_buck

  6. select * from student distribute by(Sno) sort by(Sno asc);

其中,可以用distribute by(sno) sort by(sno asc)替代cluster by(Sno),这是等价的。cluster by(Sno) = 分桶+排序

先分发,再局部排序。区别是distribute更加灵活,可以根据一个字段分区,另外字段排序。

第二个子查询的输出了4个文件作为主查询的输入。

分桶表的原理与作用

原理:

Hive是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。(原理和MapReduce的getPartition方法相同)

作用:

(1) 最大的作用是用来提高join操作的效率;

前提是两个都是分桶表且分桶数量相同或者倍数关系?

思考这个问题:

select a.id,a.name,b.addr from a join b on a.id = b.id;

如果a表和b表已经是分桶表,而且分桶的字段是id字段

做这个join操作时,还需要全表做笛卡尔积吗?

对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

(2)取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

  1. insert语句

 
   
   
 
  1. Hive一条一条的insert太慢。

  2. 但是可以批量的insert.实际就是想文件夹中追加文件。

  1. 保存select查询结果的几种方式

 
   
   
 
  1. 1、将查询结果保存到一张新的hive表中

  2. create table t_tmp

  3. as

  4. select * from t_p;

  5. 2、将查询结果保存到一张已经存在的hive表中

  6. insert into table t_tmp

  7. select * from t_p;

  8. 3、将查询结果保存到指定的文件目录(可以是本地,也可以是HDFS

  9. insert overwrite local directory '/home/hadoop/test'

  10. select * from t_p;

  11. 插入HDFS

  12. insert overwrite directory '/aaa/test'

  13. select * from t_p;

14.查看、删除

 
   
   
 
  1. SELECT [ALL | DISTINCT] select_expr, select_expr, ...

  2. FROM table_reference

  3. [WHERE where_condition]

  4. [GROUP BY col_list [HAVING condition]]

  5. [CLUSTER BY col_list

  6. | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]

  7. ]

  8. [LIMIT number]

常用函数

 
   
   
 
  1. 1.isnull(string a) --如果anull,返回flase,如果啊不为空,返回true

  2. 2.ROUND(double a)四舍五入bigint类型

  3.  CEILING       --舍入到最大整数   3.33舍入到4    2.98舍入到3    -3.61舍入到-3

  4.  FLOOR()       --舍入到最小整数   3.33舍入到3    2.98舍入到2    -3.61舍入到-4

  5. 3.map(key1, value1, key2, value2, …)通过指定的键/值对,创建一个map

  6. 4.cast(expr as <type>)类型转换。例如将字符”1″转换为整数:cast(’1 as bigint),如果转换失败返回NULL

  7.  例:CAST(num*100 AS decimal(8,0)) as num

  8. 5.unix_timestamp()  --如果不带参数的调用,返回一个Unix时间戳(从’1970- 01 0100:00:00′到现在的UTC秒数)

  9.   --指定日期参数调用UNIX_TIMESTAMP(),它返回参数值’1970- 01 0100:00:00′到指定日期的秒数

  10.  unix_timestamp(string date, string pattern)   --指定时间输入格式,返回到1970年秒数:unix_timestamp(’2009-03-20′, yyyy-MM-dd’) = 1237532400

  11.  from_unixtime(bigint unixtime[, string format])

  12.    例:select from_unixtime(1505750400,'%Y-%m-%d %H-%i-%S');

  13.  --UNIX_TIMESTAMP参数表示返回一个值’YYYY- MM DD HHMMSS’或YYYYMMDDHHMMSS.uuuuuu格式,这取决于是否是在一个字符串或数字语境中

  14.  to_date(string timestamp)    --返回时间中的年月日: to_date(“1970-01-01 00:00:00″) = 1970-01-01

  15.  to_dates(string date)     --给定一个日期date,返回一个天数(0年以来的天数)

  16.  yearmonthdayhourminutesecondweekofyear    --日期转年、转月…………

  17.  hour  --返回指定时间的小时,范围为0-23  

  18.  weekofyear(string date)   --返回指定日期所在一年中的星期号,范围053

  19.  datediff('string enddate','string startdate')     --两个时间参数的日期之差

  20.  DATEDIFF ( date-part, date-expression-1, date-expression-2 )      --返回两个日期之间的间隔

  21.  date-part : year | quarter | month | week | day | hour | minute | second | millisecond

  22.  sec_to_time(秒)    --将秒转化成时间

  23.  time_to_sec(时间)   --将时间转化为秒

  24.  date_add(string startdate,int days)       --给定时间,在此基础上加上指定的时间段

  25.  date_sub(string startdate,int days)       --给定时间,在此基础上减去指定的时间段

  26. 6.CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END    --当a=b时,返回c;当a=d时,返回e,否则返回f

  27.  CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END      --当值为a时返回b,当值为c时返回d。否则返回e

  28. 7.concat(string A, string B…)   --连接多个字符串,合并为一个字符串,可以接受任意数量的输入字符串

  29.                                --任何字符与null连接都是NULL

  30.  concat_ws(string SEP, string A, string B…)    --带分隔符字符串连接函数

  31.  例如:select concat_ws('_','abc','def','gh') from lxw_dual;返回 abc_def_gh

  32.  行转列,e.g. select concat_ws('_',collect_set(visitor_name))

  33. 8.upper(string A) 或者 ucase(string A)   --将文本字符串转换成字母全部大写形式

  34. 9.lower(string A) 或者 lcase(string A)   --将文本字符串转换成字母全部小写形式

  35. 10.trim(string A)   --删除字符串两端的空格,字符之间的空格保留

  36.   ltrim   --左边去空格

  37.   rtrim   --右边去空格

  38. 11.like     --例如:a like b --如果字符串A或者字符串BNULL,则返回NULL;如果字符串A符合表达式B  的正则语法,则为TRUE;否则为FALSE

  39.            --B中字符”_”表示任意单个字符,而字符”%”表示任意数量的字符。

  40.   例如:select aaaaaa like '%aaa%'

  41. 12.split(string str, string pat)    --将字符串转换为数组,以pat为分隔

  42. 13.substr(string A, int start) 或者 substring(string A, int start) --字符串截取函数,

  43.   例:select substr(‘abcde’,3);  --返回cde

  44.   例:select substring('ancdefghijklmn',4,8);    --返回 defghijk    

  45.    该子字符串从指定的 beginIndex 处开始, endIndex:到指定的 endIndex-1处结束。  

  46. 14.regexp_extract    --正则表达式解析函数  通过下标返回正则表达式指定的部分

  47. regexp_extract(str, regexp[, idx])

  48. 其中:

  49. str是被解析的字符串

  50. regexp 是正则表达式

  51. idx是返回结果 取表达式的哪一部分  默认值为1

  52. 0表示把整个正则表达式对应的结果全部返回,1表示返回正则表达式中第一个() 对应的结果 以此类推

  53. from

  54.     (select distinct id,      name,   val   from text_table

  55.      where p_provincecode=12345    and regexp_extract(lower(id),'(@id)$|(@num)(\\d*)$',0) <>''

  56.     )a

  57. $   匹配行结束符;

  58. *   匹配0或多个正好在它之前的那个字符;重复零次或多次

  59. \   这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配;

  60. |   将两个匹配条件进行逻辑“或”(Or)运算;

  61. \d  匹配数字。在hive这种写正则表达式需要用\转义,所以\\d

  62. ^   匹配一行的开始

  63. ?   匹配01个正好在它之前的那个字符;重复零次或一次

  64. .   匹配除换行符号外的任意字符

  65. 15.regexp_replace(string A, string B, string C)    --正则表达式替换函数 字符串A中的B字符被C字符替代

  66. regexp_replace(trim(waitbegin), '/', '-')

  67. unix_timestamp(concat_ws(':', regexp_replace(trim(ackbegin), '/', '-'), '00'))-unix_timestamp(concat_ws(':', regexp_replace(trim(waitbegin), '/', '-'), '00')) as wait_duration,

  68. 16.get_json_object(string json_string, string path)  --json解析函数  解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL

  69. 17.内置聚合函数  countsumavgminmax

  70. 18.left semi join ... on ...--只打印左边的表中的列,规律是如果主键在右边表中存在,则打印,否则过滤掉

  71. --相当于sqlin

  72. --不会产生重复的多条记录

  73. 19.collect_set --与group by组合能列转行,相当于group_concat

  74. 20.SELECT  COALESCE(NULL, NULL, GETDATE())  --由于两个参数都为null,所以返回getdate()函数的值,也就是当前时间。即返回第一个非空的值。由于这个函数是返回第一个非空的值,所以参数里面必须最少有一个非空的值,如不是,将会报错

  75. sql:注意问题

  76. 1.hive中只有union 没有union all

  77. union --联合两张表(会自动去重,两张表取出的字段个数和类型必须一致)    并集操作

  78. union all  --联合两张表的所有数据(不会去重,两张表取出的字段个数和类型必须一致)     并集操作

  79. 2.ABS() --求绝对值

  80. 3.over函数结合的几个函数介绍

  81. 参考网址:http://blog.csdn.net/winer2008/article/details/4283539

  82. row_number()over()、rank()over()和dense_rank()over()函数的使用

  83.  row_number() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利用它来实现分页

  84.  dense_rank() 是连续排序,两个第二名仍然跟着第三名

  85.  rank()       是跳跃排序,两个第二名下来就是第四名

  86. row_number() OVER (PARTITION BY COL1 ORDER BY COL2)

  87. --表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

  88. 例:row_number() over (partition BY stbid,userid ORDER BY timestamp) AS group_idx,

  89. --overorder by salary range between 5 preceding and 5 following):窗口范围为当前行数据幅度减55后的范围内的。

  90. sum(s)over(order by s range between 2 preceding and 2 following) 表示加22的范围内的求和

  91. --overorder by salary rows between 5 preceding and 5 following):窗口范围为当前行前后各移动5行。

  92. sum(s)over(order by s rows between 2 preceding and 2 following)表示在上下两行之间的范围内

  93. 4.group by having

  94. SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2

欢迎关注,更多福利


以上是关于hive中 常用操作的主要内容,如果未能解决你的问题,请参考以下文章

hive 表的常用操作

提效小技巧——记录那些不常用的代码片段

Hive中常用的字符串操作

Hive 系列—— Hive 常用 DDL 操作

C#常用代码片段备忘

常用python日期日志获取内容循环的代码片段