sqoop 兼容性问题

时间:2022-04-29
本文章向大家介绍sqoop 兼容性问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
--direct 只支持mysql 5.0 + 和postgresql 8.3+(只是import)
jdbc的jar包需要放在$SQOOP_HOME/lib目录下

mysql zeroDateTimeBehavior
mysql允许DATE列使用'0000-00-00' 如果不处理sqoop默认给转换为null
当然你也可以自己指定为 round,自动转换为('0001-01-01')
$ sqoop import --table foo 
    --connect jdbc:mysql://db.example.com/someDb?zeroDateTimeBehavior=round

mysql UNSIGNED 列
如果是UNSIGNED的,它是介于0 and 2^32 (4294967295)的,但是数据库会告诉sqoop,这是整形
整形的大小是介于-2147483648 and +2147483647的,超过214748364的,它处理不了。


--direct模式不支持BLOB和CLOB,不支持视图

为了性能,一般的是32MB提交一次,可以通过 -D sqoop.mysql.export.checkpoint.bytes=size来指定
它的单位是bytes,设置为0,就禁用检查点了。

在对生产环境导入数据时,用户也在用,我们通过stage表来解决稳定性的问题,肯定会对生产环境产生影响
我们可以通过设置 -D sqoop.mysql.export.sleep.ms=time 参数(单位毫秒)来让它停止一段时间
每传输sqoop.mysql.export.checkpoint.bytes个字节就休息一段时间

oracle部分
sqoop支持 ojdbc6.jar
oracle当中的DATE和TIME,都会当做是TIMESTAMP值,sqoop会当做java.sql.Timestamp来存储
当把数据导回到数据库的时候,sqoop会把它转换为 yyyy-mm-dd HH:MM:SS.ffffffff格式
但是你只希望yyyy-mm-dd格式

时区,默认是GMT
$ sqoop import -D oracle.sessionTimeZone=America/Los_Angeles 
    --connect jdbc:oracle:thin:@//db.example.com/foo --table bar

hive和sql的数据类型匹配
DATE,TIME,TIMESTAMP 会被当做是字符串处置, NUMERIC和DECIMAL会被认为是double
sqoop会提醒你精度丢失了

Microsoft SQL特殊的参数
--schema <name>     Scheme name that sqoop should use. Default is "dbo".
--table-hints <hints>     Table hints that Sqoop should use for data movement.

$ sqoop import ... --table custom_table -- --schema custom_schema
$ sqoop import ... --table custom_table -- --table-hints NOLOCK

PostgreSQL
$ sqoop export (generic-args) --connection-manager org.apache.sqoop.manager.PGBulkloadManager (export-args)
支持参数和例子
Property     Description
mapred.reduce.tasks     map数量
pgbulkload.bin             pg_bulkoad binary安装路径,每一台机器都有
pgbulkload.check.constraints     检查约束,默认是true
pgbulkload.parse.errors             在转义,加密,过滤,检查约束,数据类型转换中产生的错误的最大数,默认是无穷大
pgbulkload.duplicate.errors     数据重复的忍耐值. 重复值在数据库中存储是badfile,默认是无穷大
pgbulkload.filter             转换每一行为输入的数据

Here is a example of complete command line.

$ sqoop export 
    -Dmapred.reduce.tasks=2
    -Dpgbulkload.bin="/usr/local/bin/pg_bulkload" 
    -Dpgbulkload.input.field.delim=$'t' 
    -Dpgbulkload.check.constraints="YES" 
    -Dpgbulkload.parse.errors="INFINITE" 
    -Dpgbulkload.duplicate.errors="INFINITE" 
    --connect jdbc:postgresql://pgsql.example.net:5432/sqooptest 
    --connection-manager org.apache.sqoop.manager.PGBulkloadManager 
    --table test --username sqooptest --export-dir=/test -m 2