parquent官方介绍

我们创建Parquet是为了使Hadoop生态系统中的任何项目都可以使用压缩的,高效的列式数据表示形式。

Parquet是从头开始构建的,考虑了复杂的嵌套数据结构,并使用了Dremel论文中描述的记录粉碎和组装算法。我们相信这种方法优于嵌套名称空间的简单扁平化。

构建Parquet是为了支持非常有效的压缩和编码方案。多个项目已经证明了对数据应用正确的压缩和编码方案会对性能产生影响。Parquet允许在每个列的级别上指定压缩方案,并且经过了未来验证,可以在发明和实现时添加更多编码。
parquent是任何人都可以使用的。Hadoop生态系统具有丰富的数据处理框架,因此我们对玩收藏夹不感兴趣。我们认为,高效,实施良好的柱状存储基板应适用于所有框架,而无需花费大量且难以建立依赖关系。

准备数据

orderID INT, CustID INT, OrderTotal FLOAT, OrderNumItems INT, OrderDesc STRING
100,1000,100000,5,"aa"
200,2000,200000,6,"bb"
300,3000,300000,7,"cc"
400,4000,400000,8,"dd"
500,5000,500000,9,"ee"

org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat:数据允许建立软链接
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe:hive默认的列分割类型,其实就是^A分隔符,
hive中默认使用^A(ctrl+A)作为列分割符,如果用户需要指定的话,等同于row format delimited fields terminated by ‘\001’,因为^A八进制编码体现为’\001’.
所以如果使用默认的分隔符,可以什么都不加,也可以按照上面的指定加‘\001’为列分隔符,效果一样
hive默认使用的行分隔符是’\n’分隔符 ,也可以加一句:LINES TERMINATED BY ‘\n’ ,加不加效果一样。但是区别是hive可以通过row format delimited fields terminated by '\t’这个语句来指定不同的分隔符,但是hive不能够通过LINES TERMINATED BY '$$'来指定行分隔符,目前为止,hive的默认行分隔符仅支持‘\n’字符。否则报错
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat:hive默认输出格式;

hive建表语句

以下parquet_sql为
Hive 0.10 - 0.12

CREATE TABLE parquet_test (
 id int,
 str string,
 mp MAP<STRING,STRING>,
 lst ARRAY<STRING>,
 strct STRUCT<A:STRING,B:STRING>) 
PARTITIONED BY (part string)
ROW FORMAT SERDE 'parquet.hive.serde.ParquetHiveSerDe'
 STORED AS
 INPUTFORMAT 'parquet.hive.DeprecatedParquetInputFormat'
 OUTPUTFORMAT 'parquet.hive.DeprecatedParquetOutputFormat';

以下是我linux跑的类型

CREATE EXTERNAL TABLE person (first_name string,
 last_name string,
  country string) 
  ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
  STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' 
  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
  LOCATION 'hdfs://10.2.19.15:9000/person/symlink_format_manifest/';

Hive 0.13 and later

CREATE TABLE parquet_test (
 id int,
 str string,
 mp MAP<STRING,STRING>,
 lst ARRAY<STRING>,
 strct STRUCT<A:STRING,B:STRING>) 
PARTITIONED BY (part string)
STORED AS PARQUET;

实际代码:

CREATE external TABLE parquet_test (orderID INT, 
CustID INT,
 OrderTotal FLOAT,
OrderNumItems INT,
 OrderDesc STRING)
STORED AS PARQUET
location '/person/symlink_format_manifest'
TBLPROPERTIES ( 'orc.compress'='snappy');

使用插入语句插入数据:

INSERT OVERWRITE TABLE parquet_test SELECT * FROM orders_no_location;

成功执行

执行完查看orders_no_location数据大小

hadoop splitting阶段 hadoop parquet_hadoop splitting阶段


parquet_test表大小:

hadoop splitting阶段 hadoop parquet_hive_02


压缩比是12倍。

总结:parquet格式有效节省了空间的大小