如何制作Hive数据文件

在学习Hive的过程中我经常遇到的问题是没有合适的数据文件,比如在读《Programming Hive》这本书的时候就因为Employees这张表没有提供示例数据而倍感挫折。因为Hive默认用'\001'(Ctrl+A)作为字段(Fields)分隔符,'\002'(Ctrl+B)作为集合元素(Collections Items)分隔符,'\003'作为Map类型Key/Values分隔符。在编辑器中插入这几个控制字符(Control Character)需要特殊的处理,而且每个编辑器都不同。下面我要介绍两种办法来生成Hive可以使用的数据文件,其中一种办法就是直接在Vi中插入控制字符,另外一种是在创建Hive Table的时候选择可以直接编辑的分隔符。

方法一:利用编辑器直接插入控制字符,以Vi为例。

  • 进入Vi:
$vi supply-20110101.txt
  •  在Vi命令模式下,键入:set list,设置控制字符可见,成功后Vi会立即显示一个行结束标志$。填入Hive表中需要的每列数据,比如我这里需要创建一个分区表:
hive (ch09)> create table supply (id int, part string, quantity int) partitioned by (day int);
hive (ch09)> alter table supply add partition (day=20110101);
hive (ch09)> alter table supply add partition (day=20110102);
hive (ch09)> alter table supply add partition (day=20110103);
 可以看到一共需要三列数据,分别是id, part, quantity。
  • 在Vi中进入编辑模式,并填入:
10part10100$
 我在这里是想输入10作为ID, part10作为part, 100作为quantity,最后的$是行结束标志。
  • 然后移动光标到需要插入分隔符的地方,首先键入Ctrl+V,再键入字段分隔符Ctrl+A:
10^Apart10100$
  •  依次插入其他分隔符,并完成编辑:
10^Apart10^A100$
11^Apart11^A90$
12^Apart12^A110$
13^Apart13^A80$
  •  这时候可以导入数据到Hive Table了:
hive (ch09)> load data local inpath '${env:HOME}/data/supply-20110103.txt' overwrite into table supply
           > partition (day='20110103');                                                              
Copying data from file:/root/data/supply-20110103.txt
Copying file: file:/root/data/supply-20110103.txt
Loading data to table ch09.supply partition (day=20110103)
rmr: DEPRECATED: Please use 'rm -r' instead.
Moved: 'hdfs://n8.example.com:8020/user/hive/warehouse/ch09.db/supply/day=20110103' to trash at: hdfs://n8.example.com:8020/user/root/.Trash/Current
Partition ch09.supply{day=20110103} stats: [num_files: 1, num_rows: 0, total_size: 54, raw_data_size: 0]
Table ch09.supply stats: [num_partitions: 3, num_files: 3, num_rows: 0, total_size: 147, raw_data_size: 0]
OK
Time taken: 0.522 seconds
  •  查看一下刚才load的数据,确保正确:
hive (ch09)> select * from supply where day='20110103';
OK
id	part	quantity	day
10	part10	100	20110103
11	part11	90	20110103
12	part12	110	20110103
13	part13	80	20110103
Time taken: 0.229 seconds

 可以看到数据完全正确,这里还可以看到,Hive自动把select * 这样的操作转换成文件系统操作,没有生成任何MapReduce Job。

 

方法二:自定义Hive Table的分隔符。

CREATE TABLE supply (id INT, part STRING, quantity INT) PARTITIONED BY (day INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '.'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY '='
STORED AS SEQUENCEFILE;

 这样就可以避开控制字符。

猜你喜欢

转载自puffsun.iteye.com/blog/1922887
今日推荐