我使用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不用引号装饰查询?
有点遗憾 贴纸
答案 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的数据。