创建表

以下例子创建表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;

在这个例子中,表的列被指定相应的类型。备注(Comments)可以基于列级别,也可以是表级别。另外,使用PARTITIONED关键词定义的分区列与数据列是不同的,分区列实际上不存储数据。当使用这种方式创建表的时候,我们假设数据文件的内容,字段之间以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;

目前,行分隔符不能指定,因为它不是由Hive决定,而是由Hadoop分隔符。

对表的指定列进行分桶,是一个好的方法,它可以有效地对数据集进行抽样查询。如果没有分桶,则会进行随机抽样,由于在查询的时候,需要扫描所有数据,因此,效率不高。以下例子描述了,在表page_viewuserid列上进行分桶的例子:

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升序进行存储。这样组织数据允许用户有效地在这n个桶上进行抽样。合适的排序使得内部操作充分利用熟悉的数据结构来进行更加有效的查询。

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;

在这个例子,CLUSTERED BY指定列进行分桶,以及创建多少个桶。行格式分隔符指定在hive表中,行如何存储。在这种分隔符情况下,指定了字段是如何结束,集合项(数组和map)如何结束,以及map的key是如何结束的。STORED AS SEQUENCEFILE表示这个数据是以二进制格式进行存储数据在hdfs上。对于以上例子的ROW FORMAT的值和STORED 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='2016-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');

注意: 模式的改变(例如增加列),保留了表的老分区,以免它是一个分区表。所有对这些列或老分区的查询都会隐式地返回一个null值或这些列指定的默认值。

删除表和分区

删除表是相当,表的删除会删除已经建立在表上的任意索引。相关命令是:

DROP TABLE pv_users;

要删除分区。修改表删除分区:

ALTER TABLE pv_users DROP PARTITION (ds='2016-08-08')

注意:此表或分区的任意数据都将被删除,而且可能无法恢复。

results matching ""

    No results matching ""