【问题标题】:Sqoop Statements without quotes不带引号的 Sqoop 语句
【发布时间】:2015-12-13 00:29:50
【问题描述】:

我使用 sqoop 将数据从 teradata 查询到 hadoop。问题是表太大而无法一次查询。所以我需要将工作拆分成单独的任务。

sqoop import 
--connect jdbc:teradata://td.xxxxxx.com/database=db 
--as-textfile 
--table ref_product 
--target-dir /td_import/sqoop_import
--delete-target-dir
--username DB
--password secret 
--split-by "CAST(HASHBUCKET(hashrow(product_id) (BYTE(4))) AS BIGINT)" 
--columns 'product_id' 
--hive-import 
--num-mappers 200 

product_id 本身并没有很好地分布,而是带有散列和 hashbuckets。那么 Sqoop 做了什么:

1.查询最小值和最大值:

SELECT MIN( CAST(HASHBUCKET(hashrow('product_id') (BYTE(4))) AS BIGINT) ), 
MAX( CAST(HASHBUCKET(hashrow('product_id') (BYTE(4))) AS BIGINT) ) 
FROM "ref_product"

这很好用。

2.查询第一个桶:

SELECT "product_id"
FROM "ref_product"
WHERE "CAST(HASHBUCKET(hashrow(product_id) (BYTE(4))) AS BIGINT)" >=0
AND "CAST(HASHBUCKET(hashrow(product_id) (BYTE(4))) AS BIGINT)" < 100

崩溃,原因很清楚: 它由于 WHERE 属性开头和结尾的引号而崩溃。如果这些引号都不存在,查询甚至可以工作。

所以我的问题是:如何强制 sqoop 不使用引号装饰查询?

亲切的问候 汉斯

【问题讨论】:

    标签: sql hadoop jdbc teradata sqoop


    【解决方案1】:

    Sqoop 期望 --split-by 中的列名,因此它不是为表达而设计的。我想到的几个想法/问题:

    1) 为什么表大到不能查询一次?我已经看到使用 Sqoop 从 teradata 卸载 TB 数据没有任何问题。您观察到的异常或问题是什么?

    2) 您可以利用 --where 接受任意表达式来“分区”数据。

    【讨论】:

    • 1.表确实大到不能一下子查询。我只有 100GB 的假脱机空间来做我的查询。我什至不能问数据库整整一个月。 2. 是的,我知道 --where 表达式。但我想要整张桌子,而不是它的一部分。而且我不能使用属性本身,因为它分布不好。
    【解决方案2】:

    尝试使用下面提到的边界查询参数:

    sqoop 导入 --连接jdbc:teradata://td.xxxxxx.com/database=db --as-textfile --table ref_product --target-dir /td_import/sqoop_import --删除目标目录 --用户名数据库 --密码秘密 --split-by "CAST(product_id AS BIGINT) mod 200" --boundary-query "SELECT 0,199" --columns 'product_id' --hive-导入 --num-mappers 200

    仅供参考:我能够导入大约 1.5 + TB 的数据,包含 250 多列。

    【讨论】:

      猜你喜欢
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多