【问题标题】:Sqoop import using query option from Oracle database使用 Oracle 数据库中的查询选项导入 Sqoop
【发布时间】:2018-01-17 04:08:14
【问题描述】:

我正在尝试根据来自 Oracle 数据库的查询导入数据。该查询包括连接和多个表。这需要很长时间。有什么可以优化的吗?

sqoop 导入 \
--connect jdbc:oracle:thin://@localhost/DB \
--用户名 hybb \
--密码**** \
--query "SELECT l4.id, TRUNC(timestamp) dt, TO_CHAR(timestamp,'HH24') 小时, 标志, 类型, l2.on_off_det, CASE WHEN flag = 1 THEN from WHEN flag = 0 THEN to END AS CRP, SUM(CASE WHEN flag = 0 THEN 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 AND l3.ct NOT IN ('test','test1','test2') AND l4.on_off_key=l2.on_off_key AND l4.id_KEY=l3.id_KEY AND l4.startdate 在 20161111 和 20161230 和 l2.on_off_det 之间 ('Off','OffInt','On') 并输入 ('s','v','m') AND \$CONDITIONS GROUP BY l4.id, timestamp,flag,type,l2.on_off_det, CASE WHEN flag = 1 THEN 从 WHEN 标志 = 0 THEN 到 END " \
-m 1 \
--target-dir /tmp/输出

【问题讨论】:

标签: sqoop


【解决方案1】:

您绝对可以提高性能,您必须测试几个选项才能找出哪种解决方案更适合您的情况。我有两个建议

第一个>>>增加映射器,增加一个按键分割。

什么是拆分子句??来自Stack

用于指定用于生成导入拆分的表的列。这意味着它指定在将数据导入集群时将使用哪个列来创建拆分。它可用于通过实现更大的并行度来提高导入性能。 Sqoop 根据表的特定列中的值创建拆分,该列由 --split-by 由用户通过导入命令。如果不可用,则使用输入表的主键来创建拆分。

应该使用哪种类型的字段进行拆分?? 有时主键在最小值和最大值之间没有均匀的分布(如果 --split-by 不可用,则用于创建拆分)。在这种情况下,您可以指定其他具有适当数据分布的列来创建拆分以实现高效导入。

sqoop import \
--connect jdbc:oracle:thin://@localhost/DB \
--username hybb \
--password **** \
--split-by <column name>
--query "SELECT l4.id , TRUNC(timestamp) dt, TO_CHAR(timestamp,'HH24') hour, flag , type , l2.on_off_det , CASE WHEN flag = 1 THEN fro WHEN flag = 0 THEN to END AS CRP, SUM(CASE WHEN flag = 0 THEN 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 WHERE l4.rtk=l5.rtk AND l3.ct NOT IN ('test','test1','test2') AND l4.on_off_key=l2.on_off_key AND l4.id_KEY=l3.id_KEY AND l4.startdate between 20161111 AND 20161230 AND l2.on_off_det IN ('Off','OffInt','On') and type IN ('s','v','m') AND \$CONDITIONS GROUP BY l4.id, timestamp,flag,type,l2.on_off_det, CASE WHEN flag = 1 THEN fro WHEN flag = 0 THEN to END " \
-m <increase number based on your cluster> \
--target-dir /tmp/output

请参阅this Horton works 社区页面以有效使用映射器。

第二个>>>

sqoop 中有一个选项称为直接选项(--direct),最近 oracle 也支持此选项,但我不确定您是否运行复杂查询,请参阅此link 以了解更多信息.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多