Hive支持Hadoop中使用的几种熟悉的文件格式,在建表时使用
STORED AS (TextFile|RCFile|SequenceFile|AVRO|ORC|Parquet)
来指定存储格式。
1、Hive的建表语法
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
--创建临时表、外部表、内部表。内部表的存储在指定目录HDFS://user/hive/warehouse,而外部表可以指定非hdfs文件路径。
[(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
[COMMENT table_comment] --表的描述信息,同传统关系型DB
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] --指定按某个字段进行分区
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
--指定按某个字段进行分桶,桶内的数据按某个字段排序,指定桶的个数(一个桶的文件大小建议在10MB~100MB)
[SKEWED BY (col_name, col_name, ...) ON ((col_value, col_value, ...), (col_value, col_value, ...), ...) [STORED AS DIRECTORIES]
--指定造成倾斜的列和值,在元数据中记录这些倾斜的列名和值,对倾斜的值建立子目录,查询会更加得到优化
[
[ROW FORMAT row_format] --行存储格式,
--只有textfile才需指定ROW FORMAT,如 row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile;
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
]
--表存储格式 :TextFile,SequenceFile,RCFile,AVRO,ORC,Parquet,一般用最后两种格式。
[LOCATION hdfs_path] --指定存储位置
[TBLPROPERTIES (property_name=property_value, ...)] --允许开发者定义一些自己的键值对信息,如TBLPROPERTIES ("orc.compress"="ZLIB")
[AS select_statement]; --根据一个已有的查询创建表,如create table user_info as select * from user_accounts where user_type='0';
2、存储格式分析
外部数据存储到hive对象的流程:
HDFS files –> InputFileFormat –> <key, value> –> Deserializer –> Row object
从Hive对象输出到外部程序的流程:
Row object –> Serializer –> <key, value> –> OutputFileFormat –> HDFS files
- TextFile每一行是一条记录,以换行符(\ n)结尾。数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用压缩,但使用这种方式hive不会对数据进行切分,从而无法对数据进行并行操作。
- SequenceFile是HDP提供的一种二进制文件支持,使用方便、可分割、可压缩。支持三种压缩选择:NONE, RECORD, BLOCK,一般建议使用BLOCK压缩。
- RCFile是一种行列存储相结合的存储方式。首先其将数据按行分块,保证同一个Record的数据在一个块上,避免读一个记录需要读取多个block。其次块数据列式存储,有利于数据压缩和快速的列存取。
- AVRO是开源项目,为HDP提供数据序列化和数据交换服务,是基于大数据HDP的应用程序中流行的文件格式之一。
- ORC 基于RCFile改良,提供了一种将数据存储在Hive表中的高效方法。Hive从大型表读取,写入和处理数据时,使用ORC文件可以提高性能。
- Parquet是一个面向列的二进制文件格式。对于大型查询的类型是高效的,对于扫描特定表格中的特定列的查询,Parquet特别有用。默认使用Snappy压缩。
如果仅仅是在Hive中存储和查询,建议使用ORC格式,压缩比率非常大,查询性能非常高,写操作耗时比其它格式稍于差一点。
如果在Hive中存储,而使用Impala查询,使用Parquet。