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

一、sqoop import 问题总结
Sqoop import as-parquetfile时兼容decimal数据类型问题

1.建表不压缩,默认存储格式 Textfile>>>>>sqoop 导入不压缩,不指定存储格式
1.1 MySQL:decimal————>Hive:decimal, sql 查询该字段,默认为Null值; 在hdfs中查看数据,数据无误
1.2 MySQL:decimal————>Hive:double, sql 查询该字段,数据显示科学计数法
1.3 MySQL:double ————>Hive:decimal, sql 查询该字段,数据显示科学计数法
1.3 MySQL:double ————>Hive:double, sql 查询该字段,数据显示0.0 (MySQL显示是0.00)

2.建表压缩,指定存储格式 Parquet>>>>>sqoop 导入压缩,指定存储格式
(Sqoop import as-parquetfile时兼容decimal数据类型问题)

以下两种情形都是在:(都有分别测试过)
    MySQL:decimal————>Hive:decimal
    MySQL:double ————>Hive:decimal

2.1 sqoop导入数据需设置两个参数:
    -D sqoop.parquet.logical_types.decimal.enable=true 
    -D parquetjob.configurator.implementation=hadoop    
    导入才可成功,但是,SQL查询报错:
    java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: 
    java.lang.ClassCastException: org.apache.hadoop.hive.serde2.io.DoubleWritable 
    cannot be cast to org.apache.hadoop.hive.serde2.io.HiveDecimalWritable (state=,code=0)

2.2 sqoop导入数据不设置参数,导入数据失败,并报错:
    ERROR tool.ImportTool: Import failed: Cannot convert unsupported type: decimal(30,8)
    翻译显示:不能转换不支持数据类型 decimal

3.MySQL中longblob类型在hive中用何种类型替代
longblob ————> ???
enume ————> string
json ————> string

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

点击即可跳转->>具体请参考sqoop官方文档:
情景:MySQL:decimal————>Hive:decimal(30,8)

1.sqoop使用as-parquetfile需要加参数:

    -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=8 \

2.sqoop不使用as-parquetfile需要加参数:

    -D sqoop.avro.decimal_padding.enable=true \
    -D sqoop.avro.logical_types.decimal.default.precision=38 \
    -D sqoop.avro.logical_types.decimal.default.scale=8 \

select cast(table.column_name as decimal(10,2) ······

Hive建表
CREATE TABLE IF NOT EXISTS TESTDB1.TT_CUSTOMER_BASICINFO(
字段 类型 comment " "
,字段 类型 comment " "
,字段 类型 comment " "
,字段 类型 comment " "
,字段 类型 comment " "
,字段 类型 comment " "
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\036’
STORED AS parquet tblproperties (“parquet.compress”=“SNAPPY”);

导入脚本:

在这里插入代码片sqoop import \
-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 \
--connect jdbc:mysql://10.88.22.41:3306/datadb \
--username root \
--password 123456 \
--delete-target-dir \
--hive-drop-import-delims \
--hive-import \
--hive-overwrite \
--null-non-string '\\N' \
--null-string '\\N' \
--num-mappers 4 \
--fields-terminated-by "\0x1E" \
--table tt_so_invoice \
--hive-database testdb \
--hive-table tt_soo \
--as-parquetfile \
--compress \
--compression-codec org.apache.hadoop.io.compress.SnappyCodec

附:
点击即可跳转->>还可参考:

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值