Hive简介
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
安装见详情
Hive使用之JAVA API
首先是maven配置:
1 | <dependency> |
第二步在application.yml中配置hive相关参数:
1 | hive: |
第三步配置hive数据源和连接池(也可以直接使用):
1 | package gbdpcloudproviderspark.gbdpcloudproviderspark.configurer; |
配置完成就可以开始使用hive了,下面是针对一系列hive操作的java api:
1. Create Table
1 | /** |
创建hive表还可以关联hbase表
- hbase表不存在的情况:
创建hive表hive_hbase_table映射hbase表hbase_table,会自动创建hbase表hbase_table,且会随着hive表删除而删除。这里需要指定hive的schema到hbase schema的映射关系。
1 | CREATE TABLE hive_hbase_table(key int, value string) |
说明:第一个hbase_table是定义在hbase的table名称
第二个hbase_table是存储数据表的名称(“hbase.mapred.output.outputtable” = “hbase_table”这个可以不要,表数据就存储在第一个表中了) 。
1 | 可通过操作hive表为hbase中相应表添加数据 |
- hbase表存在的情况:
创建hive的外表关联hbase表,注意hive schema到hbase schema的映射关系。删除外表不会删除对应hbase表
1 | CREATE EXTERNAL TABLE hive_hbase_external_table(key int, value string) |
2. 查看表/表数据
查看表:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17"/show") (
public List<String> showtables() {
List<String> list = new ArrayList<String>();
Statement statement = null;
try {
statement = hiveDruidDataSource.getConnection().createStatement();
String sql = "show tables";
logger.info("Running: " + sql);
ResultSet res = statement.executeQuery(sql);
while (res.next()) {
list.add(res.getString(1));
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
查看某表结构:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34/**
* 查询Hive库中的某张数据表字段信息
*/
"/describe") (
public List<String> describeTable(String tableName) throws SQLException {
List<String> list = new ArrayList<String>();
Statement statement = hiveDruidDataSource.getConnection().createStatement();
String sql = "describe " + tableName;
logger.info("Running: " + sql);
ResultSet res = statement.executeQuery(sql);
while (res.next()) {
list.add(res.getString(1));
}
return list;
}
"/metadata") (
public List<Map<String, String>> metadata(String tableName) throws SQLException{
List<Map<String, String>> metadataList = new ArrayList<>();
Statement statement = hiveDruidDataSource.getConnection().createStatement();
String sql = "DESC " + tableName;
logger.info("Running: " + sql);
ResultSet res = statement.executeQuery(sql);
while (res.next()) {
Map<String, String> colAndType = new HashMap<>();
String column = res.getString(1);
String type = res.getString(2);
colAndType.put("column", column);
colAndType.put("type", type);
metadataList.add(colAndType);
}
return metadataList;
}
查看表数据:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23/**
* 查询指定tableName表中的数据
*/
"/select") (
public List<String> selectFromTable(String tableName) throws SQLException {
Statement statement = hiveDruidDataSource.getConnection().createStatement();
String sql = "select * from " + tableName;
logger.info("Running: " + sql);
ResultSet res = statement.executeQuery(sql);
List<String> list = new ArrayList<String>();
int count = res.getMetaData().getColumnCount();
String str = null;
while (res.next()) {
str = "";
for (int i = 1; i < count; i++) {
str += res.getString(i) + " ";
}
str += res.getString(count);
logger.info(str);
list.add(str);
}
return list;
}
3. 加载/插入数据
HIVE装载数据没有做任何转换加载到表中的数据只是进入相应的配置单元表的位置移动数据文件。纯加载操作复制/移动操作。
Load 操作只是单纯的复制/移动操作,将数据文件移动到 Hive 表对应的位置。
如:从本地导入数据到表格并追加原表1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17/**
* 示例:将Hive服务器本地文档中的数据加载到Hive表中
*/
"/load") (
public String loadIntoTable() {
String filepath = "/home/hadoop/user_sample.txt";
String sql = "load data local inpath '" + filepath + "' into table user_sample";
String result = "Load data into table successfully...";
try {
// hiveJdbcTemplate.execute(sql);
hiveDruidTemplate.execute(sql);
} catch (DataAccessException dae) {
result = "Load data into table encounter an error: " + dae.getMessage();
logger.error(result);
}
return result;
}
1 | "/insert") ( |
4.删除数据
1 | /** |