我使用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
产品id本身并不是很好地分发,而是使用哈希和hashbucket。那么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查询第一个bucket:
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条答案
按热度按时间7vux5j2d1#
sqoop要求列名在--split by中,因此它不是设计为给定表达式的。我想到了几个想法/问题:
1) 为什么这个表足够大,一次都不能被查询?我见过使用sqoop从teradata卸载太字节,没有任何问题。你观察到的异常或问题是什么?
2) 您可以利用--其中接受任意表达式来“分区”数据。
vsaztqbk2#
尝试使用边界查询参数,如下所述:
sqoop导入--连接jdbc:teradata用法:/td..com/database=db--as textfile--table ref\u product--target dir/td\u import/sqoop\u import--delete target dir--username db--password secret--split by“cast(product\u id as bigint)mod 200”--边界查询“select 0199”--列“product\u id”--配置单元导入--num mappers 200
仅供参考:我能够导入大约1.5 tb的数据,包含250多列。