Hive --service cli
Hive 命令行模式用于 Linux 平台命令行查询,查询语句基本跟 MySQL 查询语句类似,运行结果如下所示。
[AppleScript] 纯文本查看 复制代码
[hadoop@zhouls Hive]$ Hive
Hive> show tables;
OK
stock
stock_partition
tst
Time taken: 1.088 seconds, Fetched: 3 row(s)
Hive> select * from tst;
OK
Time taken: 0.934 seconds
Hive> exit;
[hadoop@zhouls Hive]$
2、Hive Web 模式
Hive Web 界面的启动命令如下。
Hive --service hwi
通过浏览器访问 Hive,默认端口为 9999。
3、 Hive 的远程服务
远程服务(默认端口号 10000)启动方式命令如下,“nohup...&” 是 Linux 命令,表示命令在后台运行。
[AppleScript] 纯文本查看 复制代码
nohup Hive --service Hiveserver & //在Hive 0.11.0版本之前,只有HiveServer服务可用
nohup Hive --service Hiveserver2 & //在Hive 0.11.0版本之后,提供了HiveServer2服务
Hive 远程服务通过 JDBC 等访问来连接 Hive ,这是程序员最需要的方式。
这里,我是安装的是Hive1.0版本,所以启动 Hive service 命令如下。
[AppleScript] 纯文本查看 复制代码
Hive --service Hiveserver2 & //默认端口10000
Hive --service Hiveserver2 --Hiveconf Hive.server2.thrift.port 10002 & //可以通过命令行直接将端口号改为10002
Hive的远程服务端口号也可以在Hive-default.xml文件中配置,修改Hive.server2.thrift.port对应的值即可。
[AppleScript] 纯文本查看 复制代码
< property>
< name>Hive.server2.thrift.port< /name>
< value>10000< /value>
< description>ort number of HiveServer2 Thrift interface when Hive.server2.transport.mode is 'binary'.< /description>
< /property>
Hive 的 JDBC 连接和 MySQL 类似,如下所示。
[AppleScript] 纯文本查看 复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class HiveJdbcClient {
private static String driverName = "org.apache.Hive.jdbc.HiveDriver";//Hive驱动名称 Hive0.11.0之后的版本
//private static String driverName = "org.apache.hadoop.Hive.jdbc.HiveDriver";//Hive驱动名称 Hive0.11.0之前的版本
public static void main(String[] args) throws SQLException {
try{
Class.forName(driverName);
}catch(ClassNotFoundException e){
e.printStackTrace();
System.exit(1);
}
//第一个参数:jdbc:Hive://zhouls:10000/default 连接Hive2服务的连接地址
//第二个参数:hadoop 对HDFS有操作权限的用户
//第三个参数:Hive 用户密码 在非安全模式下,指定一个用户运行查询,忽略密码
Connection con = DriverManager.getConnection("jdbc:Hive://zhouls:10000/default", "hadoop", "");
System.out.print(con.getClientInfo());
}
}
解释器、编译器、优化器
Driver 调用解释器(Compiler)处理 HiveQL 字串,这些字串可能是一条 DDL、DML或查询语句。编译器将字符串转化为策略(plan)。策略仅由元数据操作 和 HDFS 操作组成,元数据操作只包含 DDL 语句,HDFS 操作只包含 LOAD 语句。对插入和查询而言,策略由 MapReduce 任务中的具有方向的非循环图(directedacyclic graph,DAG)组成,具体流程如下。
1)解析器(parser):将查询字符串转化为解析树表达式。
2)语义分析器(semantic analyzer):将解析树表达式转换为基于块(block-based)的内部查询表达式,将输入表的模式(schema)信息从 metastore 中进行恢复。用这些信息验证列名, 展开 SELECT * 以及类型检查(固定类型转换也包含在此检查中)。
3)逻辑策略生成器(logical plan generator):将内部查询表达式转换为逻辑策略,这些策略由逻辑操作树组成。
4)优化器(optimizer):通过逻辑策略构造多途径并以不同方式重写。
优化器的功能如下:
将多 multiple join 合并为一个 multi-way join;
对join、group-by 和自定义的 map-reduce 操作重新进行划分;
消减不必要的列;
在表扫描操作中推行使用断言(predicate);
对于已分区的表,消减不必要的分区;
在抽样(sampling)查询中,消减不必要的桶。此外,优化器还能增加局部聚合操作用于处理大分组聚合(grouped aggregations)和 增加再分区操作用于处理不对称(skew)的分组聚合。
Hive的数据库与目录对应关系
[AppleScript] 纯文本查看 复制代码
hive> show databases;
OK
default
若是自己新建一个数据库,如lesson1
[AppleScript] 纯文本查看 复制代码
hive> create database lesson1;
hive> describe database extended lesson1;
对应hdfd目录上是,/user/hive/metastore/lesson1.db/
然后在这个数据库下,新建表。这里不多赘述啦
Hive中的数据组织形式
Hive的Metastore
Hive点滴 – 数据类型http://debugo.com/hive-datatype/
7. 复合类型 复合类型在关系数据库中不曾提供,因为这些类型破坏了关系数据库的范式规则。
arrays: ARRAY<data_type> 定义数组需要指定数组的类型,数组中每一个元素都有相同的类型。访问数组中的元素使用下标访问。
maps: MAP<primitive_type, data_type> 一组键值对组成的元组,其中的值可以通过[‘KEY’]来访问。例如name的内容是map(‘first’, ‘John’, ‘last’, ‘Doe’) ,那么第一个元组是name[‘first’]。
structs: STRUCT<col_name : data_type [COMMENT col_comment], …> 类似于C语言的struct。struct内的元素可以通过”.”来访问。例如STRUCT {first STRING; last STRING}, first则可以用name.frist来访问。
union: UNIONTYPE<data_type, data_type, …> 从0.7.0开始提供。UNION类型可以如下定义,可以包含若干个任意其他类型:
CREATE TABLE union_test(foo UNIONTYPE<int, double, array<string>, struct<a:int,b:string>>);
8. 表的文本编码分割符1
2
3
4
5
6
7
8
9
10
11
12
13
| CREATE TABLE employees (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '01'
COLLECTION ITEMS TERMINATED BY '02'
MAP KEYS TERMINATED BY '03'
LINES TERMINATED BY 'n'
STORED AS TEXTFILE;
|
Hive数据类型的文本编码:
hive的数据文件使用几种默认分割符来分割:
记录分割符“n” 分割记录,即每一行就是一个记录
域分割符 “^A”或八进制01 分割各个字段
集合元素类型分割符 “^B”或八进制02 分割struct、分割array和map中的key-value pairs
map键值分割符 “^C”或八进制03 分割map中的键和值
例如上面的表中的数据可能是:
1
| Bill King^A60000.0^AFederal Taxes^C.15^BState Taxes^C.03^BInsurance^C.1^A300 Obscure Dr.^BObscuria^BIL^B60100
|
所以CSV文件的外部表定义可以是:ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,';
Hive服务
Hive Server和Hive server2都是一种远程服务。
前3项已经属于老的用法了,现在都用后2项。即,Hive Server2和Hive Metastore Server 。
Hive QL之DDL和DML
内部表和外部表
注意,指定多个分区时,hdfs上存储目录按照分区创建顺序形成树形结构。
文件数据导入表LOAD
作者:大数据躺过的坑
目前研究领域:大数据、机器学习、深度学习、人工智能、数据挖掘、数据分析。 语言涉及:Java、Scala、Python、Shell、Linux等 。同时还涉及平常所使用的手机、电脑和互联网上的使用技巧、问题和实用软件。
出处:http://www.cnblogs.com/zlslch/