我正在尝试根据oracle数据库中的查询导入数据。查询包括多个表上的联接和查询。这需要很长时间。有什么可以优化的吗?
sqoop导入
--连接jdbc:oracle:瘦://@localhost/db
--用户名hybb
--密码****
--查询“select l4.id,trunc(timestamp)dt,to_char(timestamp,'hh24')hour,flag,type,l2.on\u off\u det,case when flag=1,fro when flag=0,to end as crp,sum(case when flag=0,dur when flag=1,then round(cnt,0)else 0 end)csum,count(l4.id)ccnt from admin.t1 l2,admin.t2 l3,admin.t3 l4,admin.t4 l5,其中l4.rtk=l5.rtk和l3.ct不在('test','test1','test2')和l4.on_off_key=l2.on_off_key和l4.id_key=l3.id_key和l4.startdate介于20161111和20161230之间,l2.on_off_det在('off','offint','on')和键入('s','v','m')和$按l4.id、时间戳、标志、类型、l2.on_off det分组的条件,当flag=1时为case,当flag=0时为fro,然后结束“
-米1
--目标目录/tmp/输出
1条答案
按热度按时间suzh9iv81#
您肯定可以提高性能,您必须测试几个选项,以找出哪个解决方案更适合您的情况。我有两个建议
第一个>>>通过添加一个splitby键来增加Map器。
什么是按条款分割??从堆栈
它用于指定用于为导入生成拆分的表的列。这意味着它指定在将数据导入集群时将使用哪个列来创建拆分。它可以通过实现更大的并行性来提高导入性能。sqoop根据用户通过import命令通过--split by指定的表的特定列中的值创建拆分。如果不可用,则使用输入表的主键创建拆分。
应使用哪种类型的字段进行拆分??有时主键的最小值和最大值之间的值分布不均匀(如果--split by不可用,则用于创建拆分)。在这种情况下,您可以指定其他具有适当数据分布的列来创建有效导入的拆分。
请参阅本霍顿作品社区网页的有效使用Map。
第二个>>>
sqoop中有一个名为direct option(--direct)的选项,最近oracle也支持这个选项,但我不确定是否运行了复杂查询,请参阅此链接了解更多信息。