[译]Hive学习指南(二)

Hive SQL的能力

Hive's SQL提供了基本SQL操作。这些操作作用于表和分区,具有以下能力:

  • 可使用WHERE过滤表中的行
  • 可使用SELECT选择表中指定的列
  • 可进行表连接
  • 可使用group by进行聚合
  • 可下载表内容到本地目录(如nfs)
  • 可将查询结果存储到hadoop dfs目录中
  • 可管理表和分区(create, drop和alter)
  • 可对自定义的map/reduce作业插入自定义的脚本

Hive SQL的使用和示例

创建,显示,修改和删除表

创建,显示,修改和删除表的详细信息,请参见Hive Data Definition Language

创建表
创建page_view表:

CREATE TABLE page_view(viewTime INT, userid BIGINT,
                page_url STRING, referrer_url STRING,
                ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;

在这里示例中可以看到,表的列都指定了相应的类型。可以在列和表上添加注释。另外,PARTITIONED BY语句定义了表的分区,分区与数据列不同,而且和数据不存储在一起。创建出来的page_view表,数据的字段分隔符是ASCII 001(ctrl-A),行分隔符是换行符。

字段分隔符可以用参数指定:

CREATE TABLE page_view(viewTime INT, userid BIGINT,
                page_url STRING, referrer_url STRING,
                ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
ROW FORMAT DELIMITED
        FIELDS TERMINATED BY '1'
STORED AS SEQUENCEFILE;

行分隔符目前不能修改,它是Hadoop分隔符。

建议在表中的某些列上进行分桶,这样可以在数据集上进行有效的抽样查询。不使用桶,随机抽样还是可以执行,但是效率会变低因为必须扫描整个表。下面的示例说明了page_view表在userid列上分桶:

CREATE TABLE page_view(viewTime INT, userid BIGINT,
                page_url STRING, referrer_url STRING,
                ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
        FIELDS TERMINATED BY '1'
        COLLECTION ITEMS TERMINATED BY '2'
        MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;

上面的示例,表会根据userid的哈希值将数据划分到32个桶中。每个桶中的数据会按照viewTime的升序进行存储。这样组织数据后,可以有效地抽样某个桶中的数据。使用排序属性,内部操作能够更好地利用数据结构,实现更高效的查询。

CREATE TABLE page_view(viewTime INT, userid BIGINT,
                page_url STRING, referrer_url STRING,
                friends ARRAY<BIGINT>, properties MAP<STRING, STRING>
                ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
        FIELDS TERMINATED BY '1'
        COLLECTION ITEMS TERMINATED BY '2'
        MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;

上面这个示例中,用类似类型定义的方式指定了表的列。可以在列和表上添加注释。另外,PARTITIONED BY语句定义了表的分区,分区与数据列不同,而且和数据不存储在一起。CLUSTERED BY语句指定了对哪些列进行分桶以及桶的数量。ROW FORMAT DELIMITED指定了行如何存储在Hive表中。在次基础上,指定了字段如何结尾,集合中的元素如何结尾,map中的keys如何结尾。STORED AS SEQUENCEFILE指定了数据会在hdfs上以二进制存储。上面示例中,ROW FORMATSTORED AS的值是系统默认值。

表名和列是大小写敏感的。

浏览表和分区

SHOW TABLES;

列出数据仓库中的表;可能有很多表,超出你要查看的范围。

SHOW TABLES 'page.*';

列出前缀是page的表。匹配模式遵循Java正则表达式语法。

SHOW PARTITIONS page_view;

列出表的分区。如果表没有分区会抛出错误。

DESCRIBE page_view;

列出表的行及其类型。

DESCRIBE EXTENDED page_view;

列出表的列和所有其它属性。这条语句会输出很多信息,而且格式并不友好,通常用于调试。

DESCRIBE EXTENDED page_view PARTITION (ds='2008-08-08');

列出分区的列和所有其它属性。这条语句会输出很多信息,而且格式并不友好,通常用于调试。

修改表
重命名已存在的表。如果表的新名字已经存在会报错:

ALTER TABLE old_table_name RENAME TO new_table_name;

重命名已存在表的列。要确保使用相同的列类型,之前存在的列也要列出来:

ALTER TABLE old_table_name REPLACE COLUMNS (col1 TYPE, ...);

在已存在的表中添加列:

ALTER TABLE tab1 ADD COLUMNS (c1 INT COMMENT 'a new int column', c2 STRING DEFAULT 'def val');

注意对表模式的修改(如添加列),如果这是一个分过区的表,会保留旧分区的模式。访问新列并且在纠纷去上运行的所有查询会隐式地返回一个空值或者新列指定的默认值。

之后的版本,如果在指定分区的配置中找不到新列,会返回一些特定值,不会抛出错误。

删除表和分区
删除表的命令如下:

DROP TABLE pv_users;

删除分区命令如下:

ALTER TABLE pv_users DROP PARTITION (ds='2008-08-08')
  • 注意表或者分区中的数据会被删除,而且可能无法恢复。

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

推荐阅读更多精彩内容