表的hive导入:

create table XXXXXXX201512 (N多字段构成)STORED AS PARQUETFILE;

insert into XXXXXXX201512 select * from XXXXXXX20151231;


以上的insert,3000万的数据,一般是6、7分钟的样子,,一个表到总表产生的分片数是40多个,之后查询一张表大概1秒左右

别用Spark-SQL进行以上的插入过程,原因如下:

测试用sparksql来导入:

create table XXXXXXX201512P (N多字段构成)STORED AS PARQUETFILE;

insert into XXXXXXX201512P select * from XXXXXXX20151231;

以上的insert,3000万的数据,超过了10分钟,一个表到总表产生的分片数是80多个,查询1.5秒左右


从文件数论证hive和sparksql对以上过程的分片机制:

得出结论:hive的上述过程是按照block的进行两两合并,然后压缩成为parquet文件的;sparksql是按照每个block压缩成为parquet文件的,同时,sparksql把空part也会算一个进行压缩!!!

原表的数据:

HIVE和SPARKSQL计算引擎在TEXT导入PARQUET格式的HIVE存储引擎分片数量机制_第1张图片

part0,65个block;part1,0个block;part2,11个block;part3,0个block;part4,4个block;

block数量一共是80个,而hive产生的总表中由这个表过去的数据的part数量是40个!!!sparkSQL产生的总表中由这个表过去的数据的part数量是82个!!!

由此可以看出,在进行上述操作的时候,hive至少比spark还是优化了一点的。

具体是不是我说的两两合并,有待看源码验证!!!


我个人觉得更加高端的方式是计算压缩率,通过压缩率和数据量大小,选择合适的block合并数据压缩,使数据尽量能达到每个block 128M的满负荷,这样分片数可以减少,再超大数据规模下,效率更高!!!

当然这个在代码实现或者算法上应该比较难以实现,要不然以那些世界级的专业人士,怎么会想不到我说的这段话。。。