sqoop语句

eh57zj3b  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(437)

我使用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不使用引号修饰查询?
向汉斯问好

7vux5j2d

7vux5j2d1#

sqoop要求列名在--split by中,因此它不是设计为给定表达式的。我想到了几个想法/问题:
1) 为什么这个表足够大,一次都不能被查询?我见过使用sqoop从teradata卸载太字节,没有任何问题。你观察到的异常或问题是什么?
2) 您可以利用--其中接受任意表达式来“分区”数据。

vsaztqbk

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多列。

相关问题