赞
踩
下面我们一起来研究文件格式。用户应该很熟悉以逗号或者制表符分隔的文本文件,也就是所谓的逗号分隔值(CSV)或者制表符分隔值(TSV)。只要用户需要,Hive是支持这些文件格式的。然而,这两种文件格式有一个共同的缺点,那就是用户需要对文本文件中那些不需要作为分隔符处理的逗号或者制表符格外小心。也因此,Hive默认使用了几个控制字符,这些字符很少出现在字段值中。Hive使用术语field来表示替换默认分隔符的字符。下表列举了Hive中默认的记录和字段分隔符:
分隔符 | 描述 |
---|---|
\n | 对于文本文件来说,每行都是一条记录,因此换行符可以分隔记录 |
^A(Ctrl+A) | 用于分隔字段(列)。在CREATE TABLE语句中可以使用八进制编码\001表示 |
^B | 用于分隔ARRAY或者STRUCT中的元素,或用于MAP中键-值对之间的分隔。在CREATE TABLE语句中可以使用八进制编码\002表示 |
^C | 用于MAP中键和值之间的分隔。在CREATE TABLE语句中可以使用八进制编码\003表示 |
下面这个表结构声明展示了如何明确地指定分隔符:
CREATE TABLE employees (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
ROW FORMAT DELIMITED这组关键字必须要写在其他子句(除了STORED AS…)子句之前。
字符\001是^A的八进制数。ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001’这个子句表明hive将使用^A字符作为列分隔符。
同样的,字符\002是^B的八进制数。ROW FORMAT DELIMITED COLLECTION ITEMS TERMINATED BY '\002’这个子句表明hive将使用^B字符作为集合元素间的分隔符。
最后,字符\003是^C的八进制数。ROW FORMAT DELIMITED MAP KEYS TERMINATED BY '\003’这个子句表明hive将使用^C字符作为map的键和值之间的分隔符。
子句LINES TERMINATED BY '…'和STORED AS …不需要ROW FORMAT DELIMITED关键字。
事实上,Hive目前为止对于LINES TERMINATED BY…仅支持字符’\n’,也就是说行与行之间的分隔符只能为’\n’。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。