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
sqoop1 导入 hive parquet 表中 时间戳调整为日期
Sqoop import as-parquetfile时兼容decimal数据类型解决方案(抽取MySQL数据到Hive中,decimal问题