概述
话不多说,直接上货:
hive -S :进入hive的静默模式,只显示查询结果,不显示执行过程;
hive -e ‘show tables’ :直接在操作系统命令下执行hive语句,不需要进入hive交互模式;
source /root/my.sql; :在hive模式下使用source命令执行.sql文件;
t1:创建普通表;
t2:在hdfs中的指定目录创建表;
t3:创建列分隔符为“,”的表;
t4:使用查询语句创建有数据的表;
t5:使用查询语句创建列以“,”分隔有数据的表;
Hive复杂数据类型:array、map、struct;
Hive还可以把表或分区,组织成桶。将表或分区组织成桶有以下几个目的:
第一个目的是为看取样更高效,因为在处理大规模的数据集时,在开发、测试阶段将所有的数据全部处理一遍可能不太现实,这时取样就必不可少。
第二个目的是为了获得更好的查询处理效率。
桶为了表提供了额外的结构,Hive在处理某些查询时利用这个结构,能给有效地提高查询效率。
桶是通过对指定列进行哈希计算来实现的,通过哈希值将一个列名下的数据切分为一组桶,并使每个桶对应于该列名下的一个存储文件。
在建立桶之前,需要设置hive.enforce.bucketing属性为true,使得hive能识别桶以性别为例创建分区表:
分别导入性别为”M”和”F”的“sample_data”表中的数据:
创建外部表(根据数据库中的对应字段创建外部表,location指向hdfs的文件地址):
导入数据格式为JSON的分隔符:ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
创建桶表:
创建视图view:
Hive数据的导入:
使用LOAD进行数据导入
load语句:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE]
INTO TABLE tablename [PARTITION (partcoll=va11,partcoll=va12)]
//LOCAL表示从本地文件系统中导入数据,省略则表示从HDFS中导入数据
//OVERWRITE表示是否需要覆盖表中已存在的数据
//PARTITION表示导入分区表,后跟分区条件
注意:在导入数据时要注意文件中数据之间的分隔符要与创建表时指定的分隔符相一致,否则数据导入进去显示为null;
要导入的文件内容为:
t2表创建时没有指定分隔符,默认分隔符为制表符,而文件里数据是以”,”相分割的,因此导入后数据为null,如图:
t3表创建时指定分隔符为“,”与文件分隔符一致:
有overwrite表示会覆盖原来表中的数据
数据文件导入分区表:
要导入的文件:
导入语句:
使用Sqoop进行数据的导入:
1、列出mysql数据库中的所有数据库:
sqoop list-databases
--connect jdbc:mysql://192.168.0.158:3306
--username root --password password
2、连接mysql并列出数据库中的表:
sqoop list-tables
--connect jdbc:mysql://192.168.0.158:3306/testholyrobot
--username root --password password
3、将关系型数据的表结构复制到hive中
sqoop create-hive-table
--connect jdbc:mysql://192.168.0.158:3306/testholyrobot
--username root --password password
--table holyrobot_url
--hive-table holyrobot_url
--fields-terminated-by "#"
--lines-terminated-by "n"
参数说明:
--fields-terminated-by "