Hive数据操作和数据查询

Posted chenshaowei

tags:

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

数据操作

加载数据

LOAD DATA [LOCAL] IMPATH 'path' [OVERWRITE] INTO TABLE tablename [PARTITION (column = x)];
  • LOAD DATA 加载数据
  • LOCAL 本地数据,不加LOCAL就是分布式文件系统数据
  • OVERWRITE表示覆盖表中已有数据,否则表示追加

通过查询语言插入数据

这里使用了OVERWRITE关键字,之前分区内容会被覆盖掉。这是一次插入。

INSERT OVERWRITE INTO TABLE employees
PARTITION (country = 'US', state = 'OR')
SELECT * FROM staged_employees se
WHERE se.cnty = 'US' AND se.st = 'OR';

以下为多次插入,对多个分区目录插入数据

FROM staged_employees se
INSERT OVERWRITE TABLE employees
    PARTITION (country = 'US',state = 'OR')
    SELECT * WHERE se.cnty = 'US' AND se.st = 'OR'
INSERT OVERWRITE TABLE employees
    PARTITION (country = 'US',state = 'CA')
    SELECT * WHERE se.cnty = 'US' AND se.st = 'CA'
···

动态分区插入,会自动根据字段匹配插入数据,这个减少了代码量。根据国家和州,自动分区插入数据。也可以动态和静态混合使用。动态分区功能默认情况下没有开启。

INSERT OVERWRITE TABLE employees
PARTITION (country,state)
SELECT se.cnty,se.st
FROM staged_employees se;

创建表并加载数据

用AS SELECT关键字

CREATE TABLE ca_employees
AS SELECT name,salary,address
FROM employees se
WHERE se.state = 'CA'

导出数据

  • 写出多少个文件取决于调用的reducer个数
  • 不管源表数据如何存储,Hive会把所有字段序列化成字符串写入文件
  • 没有LOCAL,导入到HDFS系统上
INSERT OVERWRITE [LOCAL] DIRECTORY '/path'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '	'
SELECT name, salary, address
FROM employees se
WHERE se.state = 'CA';

数据查询

查询语句

SELECT [ALL | DISTINCT] column1,column2
FROM tablename
[WHERE condition]
[GROUP BY col]
[ORDER BY col]
[CLUSTER BY col]
[SOTY BY col]
[LIMIT number]

常用函数:count max min sum avg

正则表达式 %任意个 _一个

CASE...WHEN...THEN句式

SELECT name,salary
    CASE
        WHEN salary <5000 THEN 'low'
        WHEN              THEN
        ELSE 
    END 
    FROM employees;

Hive对某些情况的查询不必启动MapReduce,比如简单查询表存储目录下的文件,包括WHERE过滤条件

Hive只支持等值连接。JOIN ON

四种排序的差异:ORDER BY、SORT BY、DISTRIBUTE BY、

  • ORDER BY,全局排序
  • SORT BY,区内排序,一般和DISTRIBUTE BY一起用。SORT BY是对一个reduce内的数据排序。DISTRIBUTE BY控制map的输出在reducer中如何划分的
  • CLUSTER BY,相当于SORT BY和DISTRIBUTE BY一起用

分桶表

分区针对的是数据的存储路径,分桶针对的是数据文件。分桶是将数据集分解成更容易管理的若干部分的一种技术。

创建分桶表

CREATE TABLE tablename(col type)
CLUSTER BY (col)
INTO 4 BUCKETS
//创建分桶表,分成4个桶,有4个文件。

导入数据时,要用MapReduce中的PARTITIONER。这样导入后,目录下有4个文件。

//先设置桶属性
set hive.enforce.bucketing=true;
set mapreduce.job.reduces=-1;//根据桶的个数确定reduce个数,也就是4个。

INSERT INTO TABLE table1
SELECT * FROM table2
抽样查询

对于大数据集,用户需要使用一个具有代表性的查询结果,而不是全部的查询结果,可以通过对表进行抽样来满足这个需求

SELECT * FROM tablename TABLESAMPLE(bucket x out of y on col);
//根据y的大小决定抽样比例
z个桶,(x,y) 抽z/y个桶数据

以上是关于Hive数据操作和数据查询的主要内容,如果未能解决你的问题,请参考以下文章

Hive基础操作和数据类型

SparkSQL-数据的加载和保存

hive的数据库和表操作

2021年大数据Hive:手把手教你如何吃透Hive数据库和表操作(学会秒变数仓大佬)

hive JavaAPI示例

PIG 脚本、Hive 查询和相应 MapReduce 代码的包装代码