Sqoop导入SQLServer业务数据

2 篇文章 0 订阅
2 篇文章 0 订阅

1 Sqoop

要导入的数据里面包含\n,\r,\001之类的特殊字符,那么要使用–hive-drop-import-delims去掉这些特殊字符

1.1 使用 import-all-tables将MySQL业务数据全量同步到HDFS

注意:使用sqoop import-all-tables到hdfs时不能使用–target-dir应使用–warehouse-dir

/usr/bin/sqoop import-all-tables \
--connect "jdbc:mysql://ip:port/database" \
--username '用户名' \
--password '密码' \
--warehouse-dir  "/data/hive/warehouse/mysql/zhongmo" \
--autoreset-to-one-mapper --m 1 \
--compress \
--compression-codec com.hadoop.compression.lzo.LzopCodec \
--fields-terminated-by ','

1.2 sqoop 直接导入Hive表的问题

1.1.1 如果采用parquet+snappy压缩,Sqoop导入MySQL或SqlServer的表存在字段类型是tinyint或bit时,到Hive表中默认是boolean

在这里插入图片描述
1.1.2 出现问题的原因解释

Sqoop抽取数据到Hive或HDFS时,会自动将tinyint或bit的列转为boolean类型,这就是导致抽取到Hive或HDFS中的数据中只有0和1的原因。因为默认情况下,MySQL JDBC connector 会将Tinyint(1)映射为java.sql.Types.BIT类型,而Sqoop默认会映射为Boolean类型。

官网解释

**1.1.3 解决方案 1 **
sqoop导入时加
–map-column-java 将其转换为java数据类型
–map-column-hive 将其转换为hive数据类型

import_ods_表名(){
sqoop-import \
--connect "jdbc:sqlserver://ip地址:端口号;database=数据库名称" \
--username '用户名' \
--password '密码' \
--num-mappers 1 \
--hive-import \
--hive-overwrite \
--map-column-java IsIeader=Integer,IsPreDelete=Integer,IsYeWuRenYuan=Integer \
--map-column-hiveIsIeader=Integer,IsPreDelete=Integer,IsYeWuRenYuan=Integer \
--hive-database ods \
--hive-table 表名 \
--target-dir /warehouse/ods.db/表名 \
--delete-target-dir \
--fields-terminated-by '\t' \
--as-parquetfile \
--compression-codec snappy \
--null-string '\\N' \
--null-non-string '\\N' \
--query "select * from  表名 where \$CONDITIONS"
}

修改之后 再次查看表结构,变成int类型解决。
1.2.1 解决方案2
mysql中cast用法

CAST( value AS type )

在这里插入图片描述
使用CAST转换数据类型

SQLServer  CAST(tinyint/bit 列名  AS INT) AS tinyint/bit 列名
MySQL  CAST(tinyint/bit 列名  AS SIGNED) AS tinyint/bit 列名

1.2.1 表中的时间字段(datetime,date,time,timestamp)变成 bigint类型
现象如下:将表中的时间字段采用了parquet+snappy之后,无法直接转换成时间字段
在这里插入图片描述
1.2.2 解决方案:将表中的时间字段变成string类型处理

sqoop-import -Dsqoop.parquet.logical_types.decimal.enable=true -Dparquetjob.configurator.implementation=hadoop \
--connect "jdbc:sqlserver://ip地址:端口;database=数据库名" \
--username '用户名' \
--password '密码' \
--num-mappers 1 \
--hive-import \
--hive-overwrite \
--map-column-java IsIeader=Integer,IsPreDelete=Integer,IsYeWuRenYuan=Integer,UpdateDate=String,YeJiKaiShiTime=String \
--hive-database ods \
--hive-table crm_zuoxi \
--target-dir /warehouse/ods.db/crm_zuoxi \
--delete-target-dir \
--fields-terminated-by '\t' \
--as-parquetfile \                                               -- parquet列式存储
--compression-codec snappy \                          -- snappy snappy压缩
--null-string '\\N' \
--null-non-string '\\N' \
--query "select * from  库中的 表 where \$CONDITIONS"  -- where \$CONDITIONS 代表全量导入

效果如下:
在这里插入图片描述

2.1 Sqoop import as-parquetfile时兼容decimal数据类型解决方案

现象如下:采用了parquet+snappy 数据字段类型是Decimal,导入到Hive表中表现成string类型
在这里插入图片描述

2.1.1 解决方案
在import 后加入如下参数

-Dsqoop.parquet.logical_types.decimal.enable=true
-Dparquetjob.configurator.implementation=hadoop

-D sqoop.parquet.logical_types.decimal.enable=true \
-D parquetjob.configurator.implementation=hadoop \
-D sqoop.avro.decimal_padding.enable=true \
-D sqoop.avro.logical_types.decimal.default.precision=38 \
-D sqoop.avro.logical_types.decimal.default.scale=10 \

效果如下
在这里插入图片描述

官网参考

sqoop从mysql导入hive parquet表timestamp,decimal转换问题

Sqoop import of timestamps to Avro from Postgres

sqoop系列-MySQL导入HIVE时间格问题

sqoop1 导入 hive parquet 表中 时间戳调整为日期

Sqoop import as-parquetfile时兼容decimal数据类型解决方案(抽取MySQL数据到Hive中,decimal问题

import-all-tables具体参数解析见

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值