分界文本(delimited text)格式
如果在创建表时没有指定行格式或文件格式,默认的文件格式是分界文本,默认的行格式根据下面给出的分界符来分界。分界文本格式对应的SerDe是LazySimpleSerDe,也就是Inceptor的默认SerDe。
| 分界符 | 作用 |
|---|---|
| \n | 分行 |
| ^A | 分列 |
| ^B | 分隔ARRAY或者STRUCT中的元素,或者分隔MAP中的键/值对。 |
| ^C | 分隔MAP中键/值对中的键和值 |
^A, ^B和^C分别是ASCII码1,2和3的字符。Inceptor提供从1到8的ASCII字符(八进制写法001到008),但是只能覆盖前三个。^B和^C在上表的作用仅适用于无嵌套的复合数据类型ARRAY, STRUCT和MAP,也就是说ARRAY,STRUCT和MAP中的数据类型必须是原生的。如果复合类型有嵌套,则分界符ASCII码由外层向内层递增。比如在一个ARRAY构成的ARRAY中,外层ARRAY的分界符是^B,而内层ARRAY的分界符是^C。注意在CREATE TABLE命令中写出这些分界符时必须用它们的八进制符\001,\002……\008。Inceptor的默认行格式和文件格式写出来是这样的:
CREATE TABLE ...
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
我们可以自定义分界符,比如
CREATE TABLE ...
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|';
这里我们覆盖了Inceptor默认的列分界符^A,使用了|来分界。
CREATE TABLE table_name (col_name data_type, ...)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
WITH SERDEPROPERTIES ('input.delimited'='delimiting_characters')
举例CREATE TABLE dummy (col1 int, col2 string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
WITH SERDEPROPERTIES ('input.delimited'='@#_@#')