ITPub博客

首页 > 数据库 > SQL on Hadoop > hive ORC表数据插入

hive ORC表数据插入

原创 SQL on Hadoop 作者:joshliu 时间:2021-02-23 16:57:05 0 删除 编辑

        hive ORC表的数据不能通过hive客户端load数据文件加载,也不能使用hdfs dfs -put上传到对应目录,只能通过insert into orc_table select * from tmp方式插入数据;

        由于select * from tmp查询子句的灵活性,orc表数据插入有很多方式可以选择,如hive客户端分别指定order by、distribute by、sort by、 distribute by+sort by、cluster by或者通过trafodion访问hive表进行数据加载; 

1、指定order by进行数据加载

insert into orders_orc_idx_f11 select * from orders order by o_orderkey ;
-- orders_orc_idx_f11:带行组索引的orc表;order:普通textfile表

通过指定order by进行数据加载,对数据进行全局排序,只能1个reduce中进行处理,所以hdfs对应表目录下生成1个数据文件,在相同数据量下,指定order by插入数据性能比以下几种方式慢;

2、指定sort by进行数据加载

insert into orders_orc_idx_f11 select * from orders sort by o_orderkey ;
-- orders_orc_idx_f11:带行组索引的orc表;order:普通textfile表

        通过指定sort by进行数据加载,单独在各自的reduce中进行排序,所以并不能保证全局有序,即hdfs下的每个数据文件内部是有序的,但所有数据文件合起来不是有序的;如果指定reduce为1个(set mapred.reduce.tasks = 1),则sort by和order by是一样的;

3、指定distribute by进行数据加载

insert into orders_orc_idx_f11 select * from orders distribute by O_ORDERSTATUS;
-- orders_orc_idx_f11:带行组索引的orc表;order:普通textfile表;O_ORDERSTATUS表uec值为3;reduce值为26

        通过指定distribute by进行数据加载,distribute by是控制map中的输出到reduce中是如何进行划分的,即按照distribute by指定字段的值进行hash计算,然后除以reduce值取余,结果相同的分配给同一个reduce处理,如果数据uec值低与reduce的值,hdfs存储的数据文件大小会不均匀,对查询这样的数据插入到其他表性能有影响;但对查询性能不影响(因为看似各个数据分布不均匀,但hdfs系统整合的是全部的磁盘,数据文件存储在磁盘是均匀的,不会影响到查询扫描速度);

4、指定distribute by+sort by进行数据加载

insert into orders_orc_idx_f11 select * from orders distribute by O_ORDERSTATUS sort by o_orderkey ;
-- orders_orc_idx_f11:带行组索引的orc表;order:普通textfile表

        通过指定distribute by+order by进行数据加载,将map中的输出在reduce中进行划分,然后每个reduce进行排序(参考各自的特性理解);

5、指定distribute by+sort by进行数据加载

insert into orders_orc_idx_f11 select * from orders cluster by O_ORDERSTATUS ;
-- orders_orc_idx_f11:带行组索引的orc表;order:普通textfile表

        通过指定 cluster by进行数据加载,distribute by和sort by合用就相当于cluster by,但是cluster by不能指定排序为asc或desc的规则,只能是升序排列;

5、trafodion访问hive表进行数据加载

insert into hive.hive.orders_orc_idx_f11 select * from hive.hive.orders;
-- orders_orc_idx_f11:带行组索引的orc表;order:普通textfile表

        通过trafodiong访问hive表进行数据加载,不管hive客户端创建表的时候是否指定了行组索引('orc.create.index'='true'),数据加载后查看hdfs下的数据文件的元数据,都是包含最小值、最大值、和等信息,在这种情况下,不带行组索引的表和带行组索引的表数据存储是一样的,查询效率也相同;


附录:

行组索引:http://blog.itpub.net/69985104/viewspace-2758737/



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69985104/viewspace-2758770/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-10-09

  • 博文量
    74
  • 访问量
    31011