导入数据
LOAD DATA操作,通过把文件复制或移动到表的目录中,从而把数据导入Hive的表(或分区)。
用INSERT语句把数据从一个Hive表填充到另一个,或在新建表的时候使用CTAS结构,CTAS是CREATE TABLE … AS SELECT 的缩写。
如果想把数据从一个关系型数据库直接导入Hive,可以看一下Sqoop。

1.INSERT语句
INSERT OVERWRITE TABLE target
SELECT col1,col2,
FROM source;
而对于分区的表,可以使用PARTITION子句来指明数据要插入哪个分区:
INSERT OVERWRITE TABLE target
PARTITION (dt = ‘2001-01-01’)
SELECT col1, col2
FROM source;
其中OVERWRITE关键字意味着目标表或分区中的内容会被SELECT语句的结果替换掉。如果要已经填充了内容的非分区表或分区添加记录,那么可以使用INSERT INTO TABLE。

INSERT OVERWRITE TABLE target
PARTITION(dt)
SELECT col1, col2, dt
FROM source;
这种方法称为动态分区插入。

2.多表插入
可以在同一个查询中使用多个INSERT子句。此时,这样的语法会让查询的含义更加清楚,比使用多个单独的INSERT语句效率更高,只需要扫描一遍源表就可以生成多个不想交的输出。

FROM records2
 INSERT OVERWRITE TABLE stations_by_year
 SELECT year, COUNT(DISTINCT station)
 GROUP BY year
 INSERT OVERWRITE TABLE records_by_year
 SELECT year, COUNT(1)
 GROUP BY year
 INSERT OVERWRITE TABLE good_records_by_year
 SELECT year, COUNT(1)
 WHERE temperature != 9999 AND quality IN (0, 1, ,4, 5, 9)
 GROUP BY year;

3.CREATE TABLE … AS SELECT 语句
把Hive查询的输出结果存放到一个新的表往往非常方便,这可能是因为输出结果太多,不适宜于显示在控制台上或基于输出结果还有其他后续处理。
CREATE TABLE target
AS
SELECT col1, col2
FROM source;
CTAS操作是原子的,如果SELECT查询由于某种原因失败,是不互创建新表的。

表的修改
Hive使用读时模式,所以在创建表以后,可以非常灵活地支持对表定义的修改。但在很多情况下,要由你来确保修改数据以符合新的结构。
重命名表:
ALTER TABLE source RENAME TO target;
在更新表的元数据以外,把表目录移动到新名称所对应的目录下。
对于外部表,这个操作只会更新元数据,而不会移动目录。
Hive允许修改列的定义,添加新的列,甚至用一组新的列替换表内已有的列。

添加一个新列:
ALTER TABLE target ADD COLUMNS (col3 STRING);
新的列添加在已有(非分区)列的后面。
因为Hive并不允许更新已有的记录,所以需要使用其他机制来更新底层的文件。常用做法是创建一个定义了新列的新表,然后用SELECT语句把数据填进去。

表的丢弃
用于删除表的数据和元数据,如果是外部表,只删除元数据,数据不会受到影响。
如果要删除表内的所有数据,但要保留表的定义,可以使用TRUNCATE TABLE语句:
TRUNCATE TABLE my_table;
但是对外部表不起作用,需要在Hive的shell环境中使用dfs -rmr命令来直接删除外部表目录。
还有一种方式是使用LIKE关键字创建一个与第一个表模式相同的新表:
CREATE TABLE new_table LIKE existing_table;

查询数据
ORDER BY子句对数据进行全排序。
SORT BY为每个reducer产生一个排序文件。
DISTRIBUTE BY控制某个特定行应该到哪个reducer,目的是为了进行后续的聚集操作。
如果SORT BY 和DISTRIBUTE BY中所用的列相同,可以缩写为CLUSTER BY同时指定两者所用的列。
CLUSTER BY = SORT BY + DISTRIBUTE BY