表的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也会算一个进行压缩!!!
原表的数据:
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的满负荷,这样分片数可以减少,再超大数据规模下,效率更高!!!
当然这个在代码实现或者算法上应该比较难以实现,要不然以那些世界级的专业人士,怎么会想不到我说的这段话。。。