SerDe 介紹
Hive 使用如下FileFormat 類讀寫 HDFS files:
TextInputFormat/HiveIgnoreKeyTextOutputFormat: 讀寫普通HDFS文本文件.SequenceFileInputFormat/SequenceFileOutputFormat: 讀寫SequenceFile格式的HDFS文件.
Hive 使用如下SerDe 類(反)序列化數據:
MetadataTypedColumnsetSerDe: 讀寫csv、tsv文件和默認格式文件
ThriftSerDe: 讀寫Thrift 序列化后的對象.
DynamicSerDe: 讀寫Thrift序列化后的對象, 不過不需要解讀schema中的ddl.
hive通過java寫入csv文件:http://blog.csdn.net/zengmingen/article/details/52637483
CSV Serde
CSV格式的文件也稱為逗號分隔值(Comma-Separated Values,CSV,有時也稱為字符分隔值,因為分隔字符也可以不是逗號。在本文中的CSV格式的數據就不是簡單的逗號分割的),其文件以純文本形式存儲表格數據(數字和文本)。CSV文件由任意數目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串,最常見的是逗號或制表符。通常,所有記錄都有完全相同的字段序列。
默認的分隔符:
DEFAULT_ESCAPE_CHARACTER \
DEFAULT_QUOTE_CHARACTER ?" ? ? //如果沒有,則不需要指定
DEFAULT_SEPARATOR ? ? ? ?,
建表語句:
CREATE TABLE csv_table(a string, b string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( ? "separatorChar" = "\t", ? "quoteChar" ? ? = "'", ? "escapeChar" ? ?= "\\") ?STORED AS TEXTFILE;
separatorChar:分隔符
quoteChar:引號符
escapeChar:轉意符
實驗操作
準備數據
從數據庫導出。
文件1:user1.csv
文件2:user2.csv
文件3:user3.csv
創建表
hive (zmgdb)> create table csv_t1(a string,b string,c string)
? ? ? ? ? ? > row format serde
? ? ? ? ? ? > 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
? ? ? ? ? ? > with
? ? ? ? ? ? > SERDEPROPERTIES
? ? ? ? ? ? > ("separatorChar"=",") ?
? ? ? ? ? ? > STORED AS TEXTFILE;
引號符“
hive (zmgdb)> create table csv_t2(a string,b string,c string)
? ? ? ? ? ? > ?row format serde
? ? ? ? ? ? > 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
? ? ? ? ? ? > with
? ? ? ? ? ? > SERDEPROPERTIES
? ? ? ? ? ? > ?("separatorChar"=",","quotechar"="\"")
? ? ? ? ? ? > ?STORED AS TEXTFILE;
OK
Time taken: 0.072 seconds
轉義符\
hive (zmgdb)> create table csv_t3(a string,b string,c string)
? ? ? ? ? ? > ?row format serde
? ? ? ? ? ? > 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
? ? ? ? ? ? > with
? ? ? ? ? ? > SERDEPROPERTIES
? ? ? ? ? ? > ?("separatorChar"=",","escapeChar" ? ?= "\\" )
? ? ? ? ? ? > ?STORED AS TEXTFILE;
OK
Time taken: 0.088 seconds
導入
hive (zmgdb)> load data local inpath '/data/user1.csv' into table csv_t1;
Loading data to table zmgdb.csv_t1
OK
Time taken: 0.536 seconds
hive (zmgdb)> load data local inpath '/data/user2.csv' into table csv_t2;
Loading data to table zmgdb.csv_t2
OK
Time taken: 0.181 seconds
hive (zmgdb)> load data local inpath '/data/user3.csv' into table csv_t3;
Loading data to table zmgdb.csv_t3
查詢
hive (zmgdb)> select * from csv_t1;
OK
csv_t1.a ? ? ? ?csv_t1.b ? ? ? ?csv_t1.c
% ? ? ? root ? ?Y
hello110 ? ? ? ?root ? ?Y
127.0.0.1 ? ? ? root ? ?Y
::1 ? ? root ? ?Y
localhost ? ? ? hive ? ?N
% ? ? ? hive ? ?Y
Time taken: 0.74 seconds, Fetched: 6 row(s)
hive (zmgdb)> select * from csv_t2;
OK
csv_t2.a ? ? ? ?csv_t2.b ? ? ? ?csv_t2.c
% ? ? ? root ? ?Y
hello110 ? ? ? ?root ? ?Y
127.0.0.1 ? ? ? root ? ?Y
::1 ? ? root ? ?Y
localhost ? ? ? hive ? ?N
% ? ? ? hive ? ?Y
Time taken: 0.068 seconds, Fetched: 6 row(s)
hive (zmgdb)> select * from csv_t3;
OK
csv_t3.a ? ? ? ?csv_t3.b ? ? ? ?csv_t3.c
% ? ? ? root ? ?Y
hello110 ? ? ? ?'root' ?Y
127.0.0.1 ? ? ? NULL ? ?NULL
::1 ? ? root ? ?Y
localhost ? ? ? hive ? ?N
% ? ? ? hive ? ?Y
Time taken: 0.07 seconds, Fetched: 6 row(s)
補充
如果文件內容的引號符,分隔符,轉義符,不是默認的,也不是建表語句指定的,則原樣導入。
文件user4.csv:引號符是中文單引號
導入csv_t1表
hive (zmgdb)> load data local inpath '/data/user4.csv' into table csv_t1;
Loading data to table zmgdb.csv_t1
OK
Time taken: 0.191 seconds
hive (zmgdb)> select * from csv_t1;
OK
csv_t1.a ? ? ? ?csv_t1.b ? ? ? ?csv_t1.c
% ? ? ? root ? ?Y
hello110 ? ? ? ?root ? ?Y
127.0.0.1 ? ? ? root ? ?Y
::1 ? ? root ? ?Y
localhost ? ? ? hive ? ?N
% ? ? ? hive ? ?Y
‘111111’ ? ? ? ?‘root’ ?‘Y’
‘112222’ ? ? ? ?‘r2222’ ‘Y’
Time taken: 0.06 seconds, Fetched: 14 row(s)
hive (zmgdb)>?