Sqoop语句没有引号

时间:2015-09-16 12:12:27

标签: sql hadoop jdbc teradata sqoop

我使用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不用引号装饰查询?

有点遗憾 贴纸

2 个答案:

答案 0 :(得分:1)

Sqoop期待-split-by中的列名,因此它不是设计用于表达式。我想到了几个想法/问题:

1)为什么桌子足够大,不能一次查询?我已经看到用teqata从Srado上卸下太字节没有任何问题。您正在观察的例外或问题是什么?

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

答案 1 :(得分:1)

尝试使用如下所述的boundary-query参数:

sqoop导入 --connect jdbc:teradata://td.xxxxxx.com/database=db --as,文本文件 --table ref_product --target-dir / td_import / sqoop_import --delete-目标目录 --username DB - 密码秘密 - 拆分&#34; CAST(product_id AS BIGINT)mod 200&#34; - 边界查询&#34; SELECT 0,199&#34; --columns&quot; product_id&#39; --hive进口 --num-mappers 200

仅供参考:我能够使用250多列来导入大约1.5 + TB的数据。