Hive中基本语法

1.Hive中数据库基本操作
1.1 Create/Drop/Alter/Use Database
1.2 create table
2. Hive中表的操作案例
1.3 LOAD DATA
1.4 导出Hive表数据
3.Hive中的查询语句
4. 数据导入导出
5.Order, Sort, Cluster, and Distribute By
6.Hive UDF编程
Hive相关文章

1.Hive中数据库基本操作

1.1 Create/Drop/Alter/Use Database

```CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
  [COMMENT database_comment]
  [LOCATION hdfs_path]
  [WITH DBPROPERTIES (property_name=property_value, ...)];```
  • create数据库
```create database db_hive_01;
create database if not exists db_hive_02;    --> 标准
create database if not exists db_hive_03
location ‘/user/weblog/hive/warehouse/db_hive_03.db‘;```
  • 查看数据库
show databases;
show databases like ‘db_hive*‘; --> 查看有几个数据库
desc database db_hive_01;
  • 删除数据库
drop database db_hive_01;
drop database  db_hive_01 cascade; --> 数据库中有表用cascade级联删除

1.2 create table

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)
  [(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  [SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 0.10.0 and later)]
     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [STORED AS DIRECTORIES]
  [
   [ROW FORMAT row_format]
   [STORED AS file_format]
     | STORED BY ‘storage.handler.class.name‘ [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)
  [AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  LIKE existing_table_or_view_name
  [LOCATION hdfs_path];

data_type
  : primitive_type
  | array_type
  | map_type
  | struct_type
  | union_type  -- (Note: Available in Hive 0.7.0 and later)

primitive_type
  : TINYINT
  | SMALLINT
  | INT
  | BIGINT
  | BOOLEAN
  | FLOAT
  | DOUBLE
  | DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)
  | STRING
  | BINARY      -- (Note: Available in Hive 0.8.0 and later)
  | TIMESTAMP   -- (Note: Available in Hive 0.8.0 and later)
  | DECIMAL     -- (Note: Available in Hive 0.11.0 and later)
  | DECIMAL(precision, scale)  -- (Note: Available in Hive 0.13.0 and later)
  | DATE        -- (Note: Available in Hive 0.12.0 and later)
  | VARCHAR     -- (Note: Available in Hive 0.12.0 and later)
  | CHAR        -- (Note: Available in Hive 0.13.0 and later)

array_type
  : ARRAY < data_type >

map_type
  : MAP < primitive_type, data_type >

struct_type
  : STRUCT < col_name : data_type [COMMENT col_comment], ...>

union_type
   : UNIONTYPE < data_type, data_type, ... >  -- (Note: Available in Hive 0.7.0 and later)

row_format
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
        [NULL DEFINED AS char]   -- (Note: Available in Hive 0.13 and later)
  | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

file_format:
  : SEQUENCEFILE
  | TEXTFILE    -- (Default, depending on hive.default.fileformat configuration)
  | RCFILE      -- (Note: Available in Hive 0.6.0 and later)
  | ORC         -- (Note: Available in Hive 0.11.0 and later)
  | PARQUET     -- (Note: Available in Hive 0.13.0 and later)
  | AVRO        -- (Note: Available in Hive 0.14.0 and later)
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

constraint_specification:
  : [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE ]
    [, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE 
  • 创建一张表
  • 内部表
create table if not exists default.student(
sno string comment ‘学号‘,
sname string,
sex string,
sage int,
sdept string comment ‘所在班级‘
)
row format delimited fields TERMINATED by ‘ ‘
stored as textfile
location ‘/user/weblog/hive/warehouse/student‘;

-- 或者使用select创建
create table if not exists default.student_tmp
select sno,sname,sex,sage from default.student;

-- 或者使用like创建表
create table if not exists default.student_like
like default.student;
  • 外部表

    • 数据文件存储在指定的hdfs目录下,删除表数据不会从文件系统中删除
CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT ‘IP Address of the User‘,
     country STRING COMMENT ‘country of origination‘)
 COMMENT ‘This is the staging page view table‘
 ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\054‘
 STORED AS TEXTFILE
 LOCATION ‘<hdfs_location>‘;
  • 创建分区表

    • 分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成更小的数据集。
    • 在查询是通过where子句中的表达式来选择查询所需要的指定的分区,这样的查询效率会提高很多。
CREATE TABLE page_view(
viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT ‘IP Address of the User‘)
 COMMENT ‘This is the page view table‘
 PARTITIONED BY(dt STRING, country STRING)
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY ‘\001‘
STORED AS SEQUENCEFILE;

--SEQUENCEFILE 存储为压缩序列文件

--当创建的表时未创建分区时,手动创建分区目录后,需更新元数据信息:
方式一(msck repair table table_name)
方式二(alter table table_name add partition( 分区字段="分区规则"))
例如:alter table dept add partition (day=‘20180330‘)
  • 分桶排序表
CREATE TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT ‘IP Address of the User‘)
 COMMENT ‘This is the page view table‘
 PARTITIONED BY(dt STRING, country STRING)
 CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY ‘\001‘
   COLLECTION ITEMS TERMINATED BY ‘\002‘
   MAP KEYS TERMINATED BY ‘\003‘
 STORED AS SEQUENCEFILE;

2. Hive中表的操作案例

  • 创建表
--员工表
create table if not exists defaule.emp(
empno int,
ename string,
job string,
mgr int,
hiredate string
sal double,
comm double,
deptno int
)
row format delimited fields terminated by ‘ ‘
stored as textfile;

--外部表
--在创建时可以自己制定目录位置(location)
--删除表时,只会删除元数据不会删除表数据
create external table if not exists defaule.emp_ext(
empno int,
ename string,
job string,
mgr int,
hiredate string
sal double,
comm double,
deptno int
)
row format delimited fields terminated by ‘ ‘
stored as textfile
location ‘/user/weblog/hive/warehouse/emp_ext‘;

--部门表
create table if not exists defaule.dept(
deptno int,
dname string,
loc string
)
row format delimited fields terminated by ‘ ‘
stored as textfile;
  • 加载数据
load data local inpath ‘/home/hadoop/hivedata/emp.txt‘ overwrite into table emp;
load data local inpath ‘/home/hadoop/hivedata/dept.txt‘ overwrite into table dept;
  • 创建子表
create table if not exists defaule.emp_cats as
select * from emp;
  • 清除表数据
truncate table emp_cats;
  • 修改表名
alter table emp_cats rename to emp_cats_reanme;
  • 删除表
drop table if exists emp_cats_rename ;

1.3 LOAD DATA

LOAD DATA [LOCAL] INPATH ‘filepath‘
[OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
  • load data [local] inpath ‘filepath‘ [overwrite] into table tablename partition (partcol1=val1,...);
  • 原始文件的存储位置:[local]
    • 本地 local
    • hdfs
  • 对表的数据是否覆盖:[overwrite]
    • 覆盖 overwrite
    • 追加
  • 分区表加载,特殊性
    • partition (partcol1=val1,...)
  • 加载本地文件到hive表:
load data local inpath ‘/home/hadoop/datas/tmp.txt‘ into table default.tmp;
  • 加载HDFS文件到Hive中:
load data inpath ‘/user/weblog/datas/tmp.txt‘ into table default.tmp;
  • 加载数据覆盖表中已有的数据
load data inpath ‘/user/weblog/datas/tmp.txt‘ overwrite into table default.tmp;
  • 通过inster加载
create table default.student_tmp like default.student;
insert into table default.student_tmp select * from default.student
  • 创建表的时候通过loaction加载数据

    上面创建外部表的时候有案例

1.4 导出Hive表数据

  • insert导出
insert overwrite local directory ‘/home/hadoop/hive_student‘
select * from default.student;

insert overwrite local directory ‘/home/hadoop/hive_student‘
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘ ‘ COLLECTION ITEMS TERMINATED BY ‘\n‘
select * from default.student;

hive -e ‘select * from default.student;‘ > /home/hadoop/hive_student/student.txt

3.Hive中的查询语句

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
  FROM table_reference
  [WHERE where_condition]
  [GROUP BY col_list]
  [ORDER BY col_list]
  [CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
  ]
 [LIMIT [offset,] rows]
  • max、min、count、sum、avg
select count(*) cnt from emp;
select max(sal) max_sal from emp;
select min(sal) min_sal from emp;
select sum(sal) from emp;
select avg(sal) from emp;
  • group by having
分组:
每个部门的平均工资
select deptno,avg(sal) avg_sal from emp group by deptno ;
每个部门中每个岗位的最高薪水
select deptno,job,max(sal) max_sal from emp group by deptno,job;
每个部门的平均薪资大于2000的部门
select deptno,avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;

4. 数据导入导出

  • improt、export
导入语法:
IMPORT [[EXTERNAL] TABLE new_or_original_tablename [PARTITION (part_column="value"[, ...])]]
  FROM ‘source_path‘
  [LOCATION ‘import_target_path‘]
导出语法:
EXPORT TABLE tablename [PARTITION (part_column="value"[, ...])]
  TO ‘export_target_path‘ [ FOR replication(‘eventid‘) ]

export_target_path:是指HDFS上的路径
导出表数据
export table defaule.emp to ‘/user/hive/export/emp_exp‘;
导入表数据
import table default.emp from ‘/user/hive/export/emp_exp‘

5.Order, Sort, Cluster, and Distribute By

  • order by 全局数据的排序,仅仅只有一个reduce
select * from emp order by empno desc;
  • sort by 对每个reduce内部数据进行排序,对全局的结果集不是排序的
实现reduce内部排序先要设置reduce task个数
set mapreduce.job.reduces=<number>
select * from emp sort by empno asc;
将结果集写入到本地文件中查看效果
insert overwrite local directory ‘/home/hadoop/hivedata/sortby‘ select * from emp sort by empno asc;
  • distribute by

    • 类似于MapReduce中分区partition,对数据进行分区,结合soat by 进行使用
insert overwrite local directory ‘/home/hadoop/hivedata/distby‘ select * from emp distribute by deptno sort by empno asc;
注意事项:distribute by 必须要在 sort by 前面
  • cluster by 当distribute by和sort by字段相同时,可以使用cluster by;
insert overwrite local directory ‘/home/hadoop/hivedata/clusterby‘ select * from emp cluster by empno;

6.Hive UDF编程

Hive自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。

UDF:用户自定义函数,允许用户扩展HiveQL功能;

  • UDF:一进一出
  • UDAF:聚集函数,多进一出;类似于count/max/min
  • UDTF:一进多出,如lateral view explore()
  • https://cwiki.apache.org/confluence/display/Hive/HivePlugins
  • 编程步骤:
    • 1.继承org.apache.hadoop.hive.ql.UDF
    • 2.需要实现evaluate函数,evaluate函数支持重载;
  • 注意事项:
    • 1.UDF必须要有返回类型,可以返回null,但是返回类型不能为void;
    • 2.UDF中常用Text/LongWritable等类型,不推荐使用Java类型;
  • 实例:
package com.example.hive.udf;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

//将字符串转换为小写
public final class Lower extends UDF {
  public Text evaluate(final Text s) {
    if (s == null) { return null; }
    return new Text(s.toString().toLowerCase());
  }
}

//将编写好的UDF打成jar包
//把jar包加载进hive缓存
add jar /home/hadoop/demojar/hiveudf.jar
//注册成为函数(temporary 临时)
create temporary function  my_lower as "com.example.hive.udf.Lower";
//0.13之后注册方法
CREATE FUNCTION my_lower AS ‘com.example.hive.udf.Lower‘ USING JAR ‘hdfs:///path/to/jar‘;
//测试结果
select ename,my_lower(ename) lowername from default.emp;

Hive相关文章

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/Marsm/p/68b9bfbb2c88e852f00c927cc2f08242.html

时间: 2024-10-10 07:31:08

Hive中基本语法的相关文章

hive中partition如何使用

1.背景 1.在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念. 2.分区表指的是在创建表时指定的partition的分区空间. 3.如果需要创建有分区的表,需要在create表的时候调用可选参数partitioned by,详见表创建的语法结构. 2.细节 1.一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下. show partitions stage_

Hive中分组取前N个值

分享两篇文章,结合看更清楚一点. 背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科,成绩做order by排序,然后对排序后的成绩,执行自定义函数row_number(),必须带一个或者多个列参数,如ROW_NUMBER(col1, ....),它的作用是按指定的列进行分组生成行序列.在ROW_NUMBER(a,b) 时,若两条记录的a,b列相同

【甘道夫】Sqoop1.4.4 实现将 Oracle10g 中的增量数据导入 Hive0.13.1 ,并更新Hive中的主表

需求 将Oracle中的业务基础表增量数据导入Hive中,与当前的全量表合并为最新的全量表. ***欢迎转载,请注明来源***    http://blog.csdn.net/u010967382/article/details/38735381 设计 涉及的三张表: 全量表:保存了截止上一次同步时间的全量基础数据表 增量表:增量临时表 更新后的全量表:更新后的全量数据表 步骤: 通过Sqoop将Oracle中的表导入Hive,模拟全量表和增量表 通过Hive将"全量表+增量表"合并为

Hive基础sql语法(DDL)

前言: 经过前面的学习 我们了解到Hive可以使用关系型数据库来存储元数据,而且Hive提供了比较完整的SQL功能 ,这篇文章主要介绍Hive基本的sql语法. 首先了解下Hive的数据存储结构,抽象图如下: 1.Database:Hive中包含了多个数据库,默认的数据库为default,对应于HDFS目录是/user/hadoop/hive/warehouse,可以通过hive.metastore.warehouse.dir参数进行配置(hive-site.xml中配置) 2.Table: H

hive的基本语法汇总(hql)

2019/2/20 星期三 hive的基本语法汇总(hql)----------------------------------------------Hive学习3:Hive三种建表语句详解 https://blog.csdn.net/qq_36743482/article/details/78383964Hive建表方式共有三种:1.直接建表法例如:create table table_name(col_name data_type);2.查询建表法例如:通过AS 查询语句完成建表:将子查询

Hadoop Hive基础sql语法

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据.而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持

hive中order by,sort by, distribute by, cluster by作用以及用法

1. order by Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block只会启动一个reducer).但是对于大量数据这将会消耗很长的时间去执行. 这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来

kettle连接Hive中数据导入导出(6)

1.hive往外写数据 http://wiki.pentaho.com/display/BAD/Extracting+Data+from+Hive+to+Load+an+RDBMS 连接hive 表输入 1)往excel中写数据 2)往文本文件中写数据 注:这里需要填上hive的表名.字段名,不然会报如下错误: 2016/07/27 15:43:01 - 表输入.0 - ERROR (version 3.2.0, build 1 from 2016-07-07 10.46.10 by xnren

使用Sqoop,最终导入到hive中的数据和原数据库中数据不一致解决办法

Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中. 1.问题背景 使用Sqoop把oracle数据库中的一张表,这里假定为student,当中的数据导入到hdfs中,然后再创建hive的external表,location到刚才保存到hdfs中数