Hadoop数据分析平台实战——130Hive Shell命令介绍 02(熟悉Hive略过)

离线数据分析平台实战——130Hive Shell命令介绍 02(熟悉Hive略过)

导入数据

Hive的导入数据基本上可以分为三类,
第一种是从linux系统上导入数据到hive表中,
第二种是从hdfs上导入数据到hive表中,
第三种是从已有的hive表中导入数据到新的hive表中。

其中第一种和第二种语法基本类似;
在前面介绍的使用create table ... as... 命令创建表并导入数据,也属于第三种导入数据方法。
使用前两种方式导入数据,只是复制或者移动数据文件,并不会对数据的模式(数据类型)进行检查,对数据模式的检查要等到查询数据的时候才会进行。采用这种"schema on read"的模式可以提高数据加载效率。

导入数据命令

第一种命令和第二种命令的区别在于,
导入linux系统上的数据是进行文件复制,导入hdfs上的数据是进行文件移动。
也就是说在hdfs上进行数据的导入后,原位置的文件将不存在。命名如下:
load data [local] inpath 'filepath' [overwrite] into table tablename
使用local关键字来区分是从linux系统还是从hdfs上获取数据。
注意:
其实当不指定local的时候,数据来源是根据hadoop的fs.defaultFS和hive的hive.metastore.warehouse.dir来定义的,当然也可以指定路径的全部schema信息。

最后一种导入数据的命令其实我们是比较常用的一种,底层是使用mapreduce程序进行数据的导入操作的。命令如下:
INSERT (OVERWRITE|INTO) TABLE tablename1 select_statement1 FROM from_statement where_statement;
使用overwrite和into的区别在于,overwrite是进行重写操作,也就是说会将原始数据进行删除。
into是进行添加操作,原始数据不会进行删除。
注意:当我们将from语句提到最前面的时候,我们可以进行多表插入。

select命令详解

select命令和表中sql中的定义是一样的,都是查询数据表的数据,命令格式如下所示:

SELECT [ALL | DISTINCT] select_expr, select_expr, ...  -- 返回的查询列表
FROM table_reference -- from语句,一般可以放到with之后,select之前
[WHERE where_condition] -- where过滤条件
[GROUP BY col_list [HAVING having_condition]] -- 分组条件
[ORDER|SORT  BY colName (ASC|DESC)]  -- 排序条件
[LIMIT number] -- limit条件

From语句

From语句主要是指定从那个数据表中查询数据,有两种使用方式:

分别可以在select后和with后&select前使用,

语法格式:

  1. [with ...] select ... from ...
  2. [with ...] from ... select ...
    示例:
    select * from students;
    from students select *;

CTE语句

Common Table Expression(CTE)主要作用是保存临时结果,作为查询语句的公用部分,方便后面的select查询中重复使用。
语法规则为:
with cte_name [AS (select statment)] (,cte_name [AS (select statment)])* select ....

order/sort by语句

Order/Sort by语句主要用于hive中的数据排序,这两个命令的使用方式都类似sql语法中的order by。
两者的主要区别是:
sort by保证单reducer有序,order by保证全局有序,也就是说当reducer个数为多个的时候,使用sort by可能出现局部有序的情况。
另外对于order by操作,有一个小的限制,就是当hive.mapred.mode模式为strict的时候,在order by语句后面必须跟着limit语句。
语法格式如下:
(order|sort) by colname [asc|desc] (,colname [asc|desc])*

Join语法

在多表查询的时候,由于表与表之间有关联性,所有hive提供了join的语法,基本类似sql的join语法。

主要分为以下五类:
  1. 内连接(JOIN)
  2. 外链接({LEFT|RIGHT|FULL} [OUTER] JOIN)
  3. 半连接(LEFT SEMI JOIN)
  4. 笛卡尔连接(CROSS JOIN)
  5. 其他连接方式(eg. mapjoin等)
    语法格式:
    left_table_reference [join type] right_table_ref [join_condition]* ([join type] right_table_ref [join_condition]*)*

使用join建议&问题

  1. 等值连接:hive中的所有连接条件必须为等值连接条件,不支持<>等非等值连接方式。
  2. 多表连接:多表连接的时候,一般先进行left semi join,然后再进行join, 再进行外连接。(减少数据量)。
  3. join过滤条件,可以将where的过滤条件移动到join的过滤条件中去,这样可以减少网络数据量。
  4. join执行顺序都是从左到右,不管是那种join方式,那么一般将大的表放到右边,这样可以节省内存&减少网络传输。
  5. mapjoin只适合连接表是小表的情况,是一种空间换时间的解决方案。

内连接语法

内连接(JOIN)主要作用是获取连接的两张表全部匹配的数据,如果不给定join_condition的话,会进行笛卡尔乘积。
笛卡尔连接(CROSS JOIN)和内连接语法一样,区别在于:笛卡尔连接是对内连接的一种优化。
语法格式为:
table_reference [cross] join table_factor [join_condition]

外连接语法

外连接的主要作用是保留一部分没有匹配的数据。
左外连接(LEFT OUTER JOIN)的结果是包括左表中的所有行,如果左表中的某一个行在右表中不存在,那么则在相关联的结果集中右表的所有选择列值均设置为空值。
右外连接(RIGHT OUTER JOIN)就是左外连接的反先连接,将返回右表的所有行,左表进行空值填充。
全外连接(FULL OUTER JOIN)返回左表和右表的所有行,关联表中没有匹配值的直接设置为空值。
语法格式为:
table_reference {left|right|full} [outer] join table_factor join_condition

半连接语法

半连接(LEFT SEMI JOIN)是hive特有的,hive中不支持in/exists操作,所以hive提供了一个替代方案。
需要注意的是,被连接的表(右表),不能出现在查询列/其他部分(where等)中,只能出现在on字句中。(出现也是无效的)。
提出半连接的主要作用其实是提高查询效率,真正来讲的话,hive中可以使用其他连接方式来代替半连接,但是就效率而已的话,还是半连接比较高效。
语法格式:
table_reference LEFT SEMI JOIN table_factor join_condition

mapjoin

如果所有被连接的表都是小表,那么可以使用mapjoin,将需要连接的表数据全部读入mapper端内存中。
也就是说你使用mapjoin的前提就是你的连接数据比较小,mapjoin需要和其他join方式一起使用,一般情况下使用mapjoin的时候,推荐使用内连接。
语法格式为:
select /*+ MAPJOIN(table_ref1) */ ... from table_ref join table_ref1 on ....;

子查询语法

Hive对子查询的支持有限,只支持嵌套select子句,而且只能在from和with语句块中使用子查询。
语法规则如下:
.... from (select statement) [[as] tmp_name]....

导出数据

Hive中导出数据主要分为两大类,
分别是导出数据到linux系统和导出数据到hdfs文件系统上。
另外也可以认为导出数据到其他hive表也算导出数据(不过该方式也是导入数据)。
命令如下:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 [row format row_format] [stored as file_format] SELECT ... FROM ...
注意:hive导出数据支持一次导出到多个文件夹中,同多表同时导入数据一样。

其他常用命令&组件

union: 进行数据合并,格式为:
select1 union all select2... union all selectn
explain: hql执行计划查询。格式为: explain hql
hive -e "hql":在linux系统中执行hive语句。
hive -f "filepath": 执行linux系统中的包含hive语句的文件。
view:hive支持视图的使用,单只支持逻辑视图,不支持物理视图。
使用语法和table类型,创建语法格式为: create view viewname as select_statement

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容