设为首页 加入收藏

TOP

hadoop记录篇7-hive常用sql统计
2019-03-19 12:48:02 】 浏览:145
Tags:hadoop 记录 7-hive 常用 sql 统计

一 。参考文档

参考https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

二。 数据库操作

》》创建数据库

环境参考 http://blog.csdn.net/liaomin416100569/article/details/78395266

hive命令进入hive客户端

hive> create database hello
    > ;
OK
Time taken: 2.855 seconds
hive> show databases;
OK
default
hello
Time taken: 0.921 seconds, Fetched: 2 row(s)

创建的数据库文件位于/user/hive/warehouse/数据库名.db是个文件夹



可以自己制定存储的位置(必须带上hdfs协议 后面可以不指定hdfsip和端口 直接指定路径 下面的数据库就会存储在/mydata/world.db)

hive> create database world comment  ‘world’ location  'hdfs:/mydata/world.db';
OK
Time taken: 0.275 seconds

》》删除数据库

Drop database 数据库名 cascade

如果数据库下有表 不能直接删除必须带上cascade

》》使用数据库

Use 数据库名称

其他数据库参考(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL


三。表操作

》》数据类型

支持mysql基础所有数据类型(int float decimal date varchar boolean等)

同时支持数组(array_typemapmap_type) 结构(struct_type)连接( union_type)类型

》》文件格式

Hive中表数据是存储在当前数据库hdfs文件夹的同表名文件里 默认是文本文件(TEXTFILE) 行存储

其他文件类型

SEQUENCEFILE 一系列的压缩文件中(二进制文件) 行存储
ORC 支持ACID事务 支持CBO优化器
PARQUET 列式存储 类似java序列化存储 直接对象存储
AVRO AVRO格式存储 (json格式)
RCFILE 结合行和列存储的优点设计

》》表格式

内表表示元数据和文件数据被hive内部经常管理 删除内表数据 所有数据都会被删除 默认表都是内表

外表 表示文件数据被外部管理删除外表 外表数据不会被删除 比如多个表引用同一份数据时适用于使用外表

》》DDL

Create [EXTERNAL] table 表名 (列名 类型,。。。。。)
  Partitioned by (列名 类型。。。。)   --值不同拆成不同目录
  CLUSTERED BY (列名 类型。。。。)into 桶个数 --值不同拆分不同文件 has%桶个

举例(注意语法中 关键字之间只能使用空格隔开如果有tab键 都无法执行)

CREATE TABLE page_view(
viewTime INT, 
userid BIGINT,
page_url STRING, 
referrer_url STRING,
ip STRING
)
PARTITIONED BY(dt STRING, country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY'\t'
STORED AS SEQUENCEFILE;

一般情况 都是大量的数据从文件中导入hive

假设 /soft目录下 存在 文件a.txt内容

(这些数据 一行数据换行隔开列用空格隔开和表定义结构一致)

2015-12-13 11:56:20	1	www.baidu.com	www.qq.com	192.168.99.0
2015-12-13 10:56:20	1	www.baidu.com	www.qq.com	192.168.99.1
2015-12-13 9:56:20	1	www.baidu.com	www.qq.com	192.168.99.2
2015-12-13 11:56:20	1	www.baidu.com	www.qq.com	192.168.99.3
2015-12-13 44:56:20	1	www.baidu.com	www.qq.com	192.168.99.4

Hive下使用命令

LOAD DATA LOCAL INPATH '/soft/a.txt' INTO TABLE page_view PARTITION(dt='2015-12-13', country='CHINA');
如果直接是从hdfs上的路径文件上加载数据 (去掉local即可)
LOAD DATA INPATH '/soft/a.txt' INTO TABLE page_view PARTITION(dt='2015-12-13', country='CHINA');

表示从本机机器上加载 a.txt 到表 page_view 添加到date='2015-12-13', country='CHINA'分区中

查询结果:

Time taken: 2.253 seconds
hive> select * from page_VIEW;
OK
2015-12-13 11:56:20     1       www.baidu.com   www.qq.com      192.168.99.0    2015-12-13      CHINA
2015-12-13 10:56:20     1       www.baidu.com   www.qq.com      192.168.99.1    2015-12-13      CHINA
2015-12-13 9:56:20      1       www.baidu.com   www.qq.com      192.168.99.2    2015-12-13      CHINA
2015-12-13 11:56:20     1       www.baidu.com   www.qq.com      192.168.99.3    2015-12-13      CHINA
2015-12-13 44:56:20     1       www.baidu.com   www.qq.com      192.168.99.4    2015-12-13      CHINA
Time taken: 1.109 seconds, Fetched: 5 row(s)

查看文件系统




比如arry_type在创建时 可以指定array_type之间的分割父 map_type也可以指定map插入数据时的键值对分隔符

其他ddl参考文档

》》DML

支持标准的insert语句 (启动mapreduce

上面的

LOAD DATA LOCAL INPATH '/soft/a.txt' INTO TABLE page_view PARTITION(dt='2015-12-13', country='CHINA');

就是dml中用于加载本地文件数据到文件系统的例子

复制表数据到另一张表(目标表必须存在)

INSERT OVERWRITE TABLE page_view1 SELECT a.* FROM page_view a;

Create table page_view1 as select * from page_view(不存在表创建复制)

清空表

  Truncate table 表名

Hive支持原生态sql查询,关联查询, 聚合函数,分组 排序等具体参考官方文档

在官网dml语句中 有通过正则表达式匹配httd或者nginx日志的数据导入 参考

https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-DMLOperations  的Apache Weblog Data 章节


四。索引

参考https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Indexing

五 。函数

具体内置参考https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Indexing

自定义函数

添加maven依赖

<dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-cli</artifactId>
  <version>2.0.0</version>
</dependency>

添加类 继承UDF

publicfinalclassMyLength extendsUDF {
publicint eva luate(finalText s) {
if(s ==null) {return0; }
returns.toString().length();
}
}

将该类导出jar包 存储在文件系统中 本地或者hdfs

关于hive函数到java方法有多种方式

方式1

HIVE_PATH=jar包路径
create temporary function my_length as'cn.et.MyLength';
Select my_length(page_url) from page_views

方式2

添加jar包到hive环境中
hive> add jar jar包路径;(删除jar  delete jar jar路径)
hive> list jars;
create function my_length as'cn.et.MyLength';

Hive本身支持hplsql文档地址http://www.hplsql.org/doc

六。hive jdbc连接操作hiveserver2

添加maven项目 添加依赖

<dependency>
			<groupId>org.apache.hive</groupId>
			<artifactId>hive-cli</artifactId>
			<version>2.2.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hive</groupId>
			<artifactId>hive-jdbc</artifactId>
			<version>2.2.0</version>
		</dependency>

添加依赖时一定要注意这个hive-jdbc和hive-cli版本的区别 hiveserver2的版本是什么版本 jdbc依赖就用什么版本否则会报

Caused by: java.lang.IllegalArgumentException: hive configuration hive.server2.thrift.resultset.default.fetch.size does not exists.
	at org.apache.hadoop.hive.ql.processors.SetProcessor.setConf(SetProcessor.java:230)
	at org.apache.hadoop.hive.ql.processors.SetProcessor.setVariable(SetProcessor.java:171)
	at org.apache.hive.service.cli.session.HiveSessionImpl.configureSession(HiveSessionImpl.java:258)
	... 27 more

很奇葩的错误 调试jdbc发现默认是 10000 最后hiveserver2日志里也报这个错 说明客户端连接时没有告诉hiveserver2这个参数

后面查看了hive中 hive-common的版本


这里是 2.2.0 之前我用的2.3.0所以才报这个错

hive服务 启动 hiveserver2

添加jdbc的测试类

package cn.et;

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

import org.apache.hadoop.hive.ql.processors.SetProcessor;

public class TestJdbc {
	public static void main(String[] args) throws Exception {
		String driverName = "org.apache.hive.jdbc.HiveDriver";
		try {
			Class.forName(driverName);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.exit(1);
		}
		//;fetchSize=10000;hive.server2.thrift.resultset.default.fetch.size=10
		Connection con = DriverManager.getConnection("jdbc:hive2://192.168.58.147:10000/default", "root", "");
		Statement stmt = con.createStatement();
		String tableName = "testtable";
		stmt.execute("drop table if exists " + tableName);
		stmt.execute("create table " + tableName + " (key int, value string)");
		System.out.println("Create table success!");
		// show tables
		String sql = "show tables '" + tableName + "'";
		System.out.println("Running: " + sql);
		ResultSet res = stmt.executeQuery(sql);
		if (res.next()) {
			System.out.println(res.getString(1));
		}
	}
}
测试成功

解决这个错误 把jdbc的api都看完了 突然有了个自己实现驱动的想法


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Sqoop   ------- 将mysql的.. 下一篇Scala经典案例------------------..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目