一、Hive元数据配置到MySQL当中
为什么要把Hive的元数据配置到MySql中?我们可以使用多个客户端连接linux系统并且都尝试启动Hive,可以发现在启动第二个Hive客户端的时候发生报错了。
那是应为在默认的情况下,Hive元数据被保存在内嵌的Derby数据库中,只允许一个会话的连接。在开发的时候多人使用这个Hive的将会变得非常恶心。我们通过将元数据配置到MySQL中,让其支持多个会话的连接。
1.安装MySQL,参考网站:https://blog.csdn.net/qq_17776287/article/details/53536761
2.下载mysql对应的连接驱动包。
3.将下载好的mysql连接驱动上传到/usr/local/hive/lib文件夹下(hive目录下的lib文件夹里)
4.在/usr/local/hive/conf(hive目录下的conf文件夹里)目录下创建一个hive-site.xml文件
5.根据官方文档的配置参数,拷贝数据到hive-site.xml文件中
官方文档:https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin
具体配置如下(对应的地方改成你自己的配置):
<xml version="1.0">
<xml-stylesheet type="text/xsl" href="configuration.xsl">
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://{mysql所在服务器的host}:{mysql连接端口}/{数据库名称}createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>{mysql用户名}</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>{mysql用户密码}</value>
</property>
</configuration>
6.配置完毕后,如果启动hive异常,可以重新启动一下机器。(重启后别忘记启动hadoop集群)
二、hive常用交互命令参数
-help:帮助命令
-e:不进入hive的交互窗口执行SQL语句,例如:hive -e "select id from student;"
-f:执行脚本文件中的sql语句,例如:hive -f /opt/sql/hivef.sql
执行文件中的sql语句并将结果写入文件中,hive -fopt/sql/hivef.sql > /opt/sql/hive_result.txt
三、hive其他的命令操作
1.在hivecli命令窗口中使用hdfs文件系统命令
例如:查看hdfs文件系统:dfs -ls /;
2.在在hivecli命令窗口中使用本地文件系统命令
例如:查看linux下文件系统:! ls /;
3.查看hive中输入的所有历史命令
进入~目录下,“.hivehistory”文件中存放着历史命令
四、Hive常见属性配置
1.hive数据仓库位置配置
-
Default数据仓库的最原始位置是hdfs上的:/user/hive/warehouse路径下
-
在仓库目录下,没有对默认的数据库default创建文件夹。如果某张表属于default数据库,直接在数据仓库目录下创建一个文件夹。
-
修改default数据仓库原始位置(在hive-site.xml中修改)
<property>
<name>hive.metastore.warehouse.dir</name>
<value>{新的位置}</value>
</property>
2.显示当前数据库名称和查询表的表头信息
在hive-site.xml中添加如下信息
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
修改之后效果如下:
3.Hive运行日志信息配置
-
hive的log默认存放在/tmp/{当前用户名}/hive.log目录下
-
修改hive的log存放日志到/usr/local/hive/logs
-
修改/usr/local/hive/conf/hive-log4j.properties.template文件名称为hive-log4j.properties
-
在hive-log4j.properties文件中修改log存放位置
hive.log.dir=/usr/local/hive/logs
四、参数配置方式
1.查看当前配置信息
hive客户端中输入set命令
2.参数配置的三种方式
-
配置文件配置
默认的配置文件:hive-default.xml
用户自定义配置文件:hive-site.xml (需要直接新建文件)
用户自定义的配置会覆盖掉默认配置。另外,hive也会读取Hadoop的配置,hive是作为Hadoop的客户端启动的,hive的配置会覆盖掉hadoop的配置。配置文件的设定对所有本机启动的hive进程都起效。
-
命令行参数设置
例如:启动hive是,在命令行添加-hiveconfparam=value来设定参数,hive -hiveconfmapred.reduce.tasks=10;
仅对本次hive启动有效
-
参数声明方式
可以在HQL中使用set关键字设定参数,setmapred.reduce.tasks=10;
仅对本次hive启动有效
上述三种设定方式的优先级依次递增。配置文件<命令行参数<参数声明。注意某些系统级的参数,例如log4j相关的设定,必须用前两种方式设定,这些参数的读取在会话建立之前就完成了。
五、Hive数据类型
1.基本数据类型
Hive数据类型
|
Java数据类型
|
长度
|
TINYINT
|
byte
|
1byte有符号整数
|
SMALINT
|
short
|
2byte有符号整数
|
INT
|
int
|
4byte有符号整数
|
BIGINT
|
long
|
8byte有符号整数
|
BOOLEAN
|
boolean
|
布尔型,true或者false
|
FLOAT
|
float
|
单精度浮点型
|
DOUBLE |
double
|
双精度浮点型
|
STRING
|
string
|
字符串
|
TIMESTAMP
|
|
时间类型
|
BINART
|
|
字节数组
|
对于hive的String类型响度与数据库的varchar类型,这个类型是一个可变的字符串,不过他不能声明其中最多能储存多少个字符,理论上它可以存储2GB的字符数
2.集合数据类型
数据类型
|
描述
|
STRUCT
|
和C语言中的struct类似,都可以通过“点”符号访问元素类容
|
Map
|
Map是一组键值对元组集合,使用数组表示法可以访问数据。
|
ARRAY
|
数组是一组具有相同类型和名称的变量集合。
|
Hive有三种复杂数据类型ARRAY、MAP和STRUCT。ARRAY和MAP与java中的array和map相似,二struct与c语言中的Struct类似,他封装了一个命名字段集合,复杂数据类型运行任意层次的嵌套。
六、数据类型实例
1.假设某表有如下一行,我们用JSON格式来表示其数据结构。在Hive下访问的格式为
{
"name": "songsong",
"friends": ["bingbing" , "lili"] , //列表Array,
"children": { //键值Map,
"xiao song": 18 ,
"xiaoxiao song": 19
}
"address": { //结构Struct,
"street": "hui long guan" ,
"city": "beijing"
}
}
2.基于上述数据结构,我们在Hive里创建对应的表,并导入数据。
创建本地测试文件test.txt
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
3. Hive上创建测试表test
create table test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
4.导入文本数据到测试表(hive客户端中执行)
load data local inpath '/{文件路径}/test.txt' into table test;
5.访问三种集合列里的数据,以下分别是ARRAY,MAP,STRUCT的访问方式
select friends[1],children['xiao song'],address.city from test where name="songsong";
七、数据类型转换
Hive的原子数据类型是可以进行隐式转换的,类似于Java的类型转换,例如某表达式使用INT类型,TINYINT会自动转换为INT类型,但是Hive不会进行反向转化,例如,某表达式使用TINYINT类型,INT不会自动转换为TINYINT类型,它会返回错误,除非使用CAST 操作。
1.隐式类型转换规则如下。
-
任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
-
所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
-
TINYINT、SMALLINT、INT都可以转换为FLOAT。
-
BOOLEAN类型不可以转换为任何其它的类型。
2.可以使用CAST操作显示进行数据类型转换,例如CAST('1' AS INT)将把字符串'1' 转换成整数1;如果强制类型转换失败,如执行CAST('X' AS INT),表达式返回空值 NULL。