Hive 语法

建表语句

第一种常用新建原始表

create [EXTERNAL] table vv_stat_fact
(
userid  string,
stat_date string,
tryvv int,
sucvv int,
ptime float
)
 PARTITIONED BY ( 非必选;创建分区表
  dt string)
clustered by (userid) into 3000 buckets // 非必选;分桶子
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'  // 必选;指定列之间的分隔符 
STORED AS rcfile   // 非必选;指定文件的读取格式,默认textfile格式
location '/testdata/'; //非必选;指定文件在hdfs上的存储路径,如果已经有文件,会自动加载 ,默认在hive的warehouse下

第二种关联建表

create table dianxin_as_S AS select * from dianxin_503 limit 10;

注意新建表不允许是外部表。select后面表需要是已经存在的表,建表同时会加载数据。会启动mapreduce任务去读取源表数据写入新表。

CREATE EXTERNAL TABLE IF NOT EXISTS dianxin_like LIKE dianxin_503;

第三种,创建分区表
分区表指的是在创建表时指定分区空间,实际上就是在hdfs上表的目录下再创建子目录。在使用数据时如果指定了需要访问的分区名称,则只会读取相应的分区,避免全表扫描,提高查询效率。

CREATE TABLE page_view(viewTime INT, ip STRING ) PARTITIONED BY (dt STRING, country STRING) ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'

加载数据

  • 使用load data 命令
    从hdfs导入数据,路径可以是目录,会将目录下所有文件导入,但是文件格式必须一致。
    load data inpath ‘/test/’ into table dianxin_test;
  • 从本地文件系统导入
    load data local inpath ‘/test/’ into table dianxin_test;
  • 表对表加载:
    create table IF NOT EXISTS dianxin_test2 as select * from dianxin_test
    insert [overwrite] into table dianxin_test2 select * from dianxin_test;

注意:
1,如果建表语句没有指定存储路径,不管是外部表还是内部表,存储路径都是会默认在hive/warehouse/xx.db/表名的目录下。加载的数据也会移动到该表的存储目录下。注意是移动,移动,移动。不是复制
2,删除外部表,文件不会删除,对应目录也不会删除

Hive的DDL语句

  • 创建数据库 create database xxxxx;
  • 查看数据库 show databases;删除数据库 drop database tmp;
  • 强制删除数据库:drop database tmp cascade;
  • 查看表:SHOW TABLES;
  • 查看表的元信息:
    desc test_table;
    describe extended test_table;
    describe formatted test_table;
  • 查看建表语句:show create table table_XXX
  • 重命名表:
    alter table test_table rename to new_table;
  • 修改列数据类型:alter table lv_test change column colxx string;
  • 增加、删除分区:
    alter table test_table add partition (pt=xxxx)
    alter table test_table drop if exists partition(…);

Hive的DML语句

hive 中创建表 hive建表语句详解_hive

Hive函数

常见的函数

  • if函数 if(,,)
  • case when 函数:case when 。。。end
  • 日期函数:to_date…
  • 字符串函数:concat,concat_ws
  • 聚合函数:sum,count。。。
  • null值判断:is null ,is not null

高级函数
窗口函数(开窗函数):用户分组中开窗
row_number() 等
select * from (select name,date_time,row_number() over(partition by name order by cost desc) as rn from window_t)a where rn=1;
一般用于分组中求 TopN

Hive-自定义函数UDF

  • UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。
  • 编写UDF函数的时候需要注意一下几点:
  • 自定义UDF需要继承org.apache.hadoop.hive.ql.exec.UDF
  • 需要evaluate函数。
  • 步骤
  • 把程序打包放到目标机器上去;
  • 进入hive客户端,添加jar包: add jar /usr/local/testdata/hive_UP.jar;
  • 创建临时函数:hive>CREATE TEMPORARY FUNCTION f_up as ‘hive_demo.hive_udf’;
  • 查询HQL语句:
    select f_up(line) from wc_test;
    销毁临时函数:hive> DROP TEMPORARY FUNCTION f_up;
    注:UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF

Hive-jdbc的连接操作

  • 首先开启 metastore:hive --service metastore
  • 开启 hiveserver2:hive --service hiveserver2
  • 添加maven依赖
<dependency>
             <groupId>org.apache.hive</groupId>
             <artifactId>hive-jdbc</artifactId>
             <version>1.2.1/version>
 </dependency>

Java代码

package hive;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class hive_jdbc {
	public static void main(String[] args) throws Exception {
		Class.forName("org.apache.hive.jdbc.HiveDriver");
		Connection con = DriverManager.getConnection("jdbc:hive2://master:10000/zhangsan");
		Statement cs = con.createStatement();
		//查询sql,query
		ResultSet rs = cs.executeQuery("select * from zhangsan.air_id");
		//通常用于ddl操作
		//cs.execute("create table testxx");
		while(rs.next()) {
			String word = rs.getString(1);
			String count = rs.getString(2);
			System.out.println(word + ", " + count);
		}
		rs.close();
		cs.close();
		con.close();
	}
}