Hive对我来说就是一个基于HDFS的数据仓库,它提供了一个种SQL语言,能让不精通Java语言而熟悉SQL语言的工程师,快速的对HDFS或其他存储文件系统如Amazon,S3,上的数据进行数据分析,是Hadoop生态系统中非常重要的一个工具。
1.直接建表,指定分隔符,默认存储为text,也可以指定存储格式!
create table tb151
(id string comment “字段注释”,
name string,
age int)
row format delimited
fields terminated by ","
location ‘/path/to/data’;--location指定数据存放目录
create table tb151_sample as
select * from tb151 tablesample(5 rows);--抽样行数,也可是百分比(50 percent)和容量(10M)
create table test_tb like tb151 location "/path/to/data";
1.装载数据
--直接本地导入数据
load data local inpath "/path/to/data"
overwrite into table tbname;--local指本地目录,不加表示HDFS目录,overwrite关键字会覆盖表的数据
--从查询语句装载数据
insert overwrite table tbname
partition(partname="ptname")
select * from tbname2 where....;--overwrite关键字会覆盖元数据,使用into则追加数据。
2.导出数据
--如果数据文件恰好是需要的格式则直接从HDFS目录下载即可
hadoop fs -get /path
--通过查询语句
insert overwrite local directory "/path/to/data"
select ... from tbname where...;
--通过shell命令行
/path/to/hive -e "select ...from tbname where...." >> /path/to/data
1.从左到右表由小到大
2或者显示的标记大表
select /*+STREAMTABLE(t)*/t.a,t1.b from t join t1 where……;
3大多数SQL官方语言支持in…exists结构来处理如:
select s.ymd,s.symbol,s.proice from s where s.ymd,s.symbol in (select d.ymd,d.symbol from d);但是Hive是不支持这样的语法的,我们可以通过左半外连接达到同样的目的:改写为—
-- select s.ymd,s.symbol,s.proice from s left semi join d on s.ymd=d.ymd and s.symbol=d.symbol;
4小表join大表可以使用mapjoin将小表放到内存中
--select /*+MAPJOIN(d)*/ s.ymd,s.tmd from s join d on s.ymd=d.ymd;--d指的是小表
1.Hive的交集可以通过先A左关联B,然后得到的结果将右列不为NULL的元素去重即可
2.Hive的并集可以用union实现,
--select id from t1 union select id from t2 union select id from t3;
3两列元素的合集可以用union all来实现
4差集
左表A-右表B,先用Aleft joinB,然后得到的结果右列为NULL的左列元素去重即可
hive -e “select * from tbname”—执行单条语句
hive -e “select * from tbname”>>/path/to/data—将单条查询语句的结果重定向到本地文件
hive -f /path/to/sqlfile—执行sql文件
可以在hive命令行通过dfs执行Hadoop命令
也可以在hive命令行通过!+命令执行shell的一些简单命令