文章来源:http://blog.csdn.net/zengmingen/article/details/52636385
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)>