【发布时间】: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