常用的几种格式:
textfile
需要定义分隔符,占用空间大,读写效率最低,非常容易发生冲突(分隔符)的一种格式,基本上只有需要导入数据的时候才会使用,比如导入csv文件;
json
需要导入jar,http://www.congiu.net/hive-json-serde/,占用空间最大,读写效率低,基本上只有需要导入数据的时候才会使用,比如导入json文件;
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE
orc
列式存储,占用空间最小,非常适合用来做数仓;
parquet
列式存储,占用空间居中,如果后期使用spark来处理,parquet是最佳格式;
相同数据规模(1700w行)和查询条件(count+distinct+where+group by)下,4种格式的存储(不启用压缩)和查询效率如下:
|
txt
|
json
|
orc
|
parquet
|
---|---|---|---|---|
数据大小 | 2.7G | 3.4G | 149.6M | 702.7M |
hive数据写入时间 | 148s | 122s | 206s | 39s |
hive查询 | 32s | 49s | 35s | 37s |
spark查询 | 12s | 22s | 12s | 8s |
为什么spark对parquet支持更好,可以通过查看执行计划,在查询txt、json、orc表的时候,使用的是HiveTableScan,在查询parquet表时,使用的是FileScan parquet,原因就是这个特殊的优化;