概述
转载自: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 "