我是靠谱客的博主 标致白云,最近开发中收集的这篇文章主要介绍Sqoop import as-parquetfile时兼容decimal数据类型解决方案(抽取MySQL数据到Hive中,decimal问题),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

转载自:https://blog.csdn.net/Sheepflysun/article/details/108247256

一、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 ‘36’
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 "x1E" 
--table tt_so_invoice 
--hive-database testdb 
--hive-table tt_soo 
--as-parquetfile 
--compress 
--compression-codec org.apache.hadoop.io.compress.SnappyCodec

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

最后

以上就是标致白云为你收集整理的Sqoop import as-parquetfile时兼容decimal数据类型解决方案(抽取MySQL数据到Hive中,decimal问题)的全部内容,希望文章能够帮你解决Sqoop import as-parquetfile时兼容decimal数据类型解决方案(抽取MySQL数据到Hive中,decimal问题)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部