sqoop(DataX)-MySQL导入HIVE时间格问题

问题1:

用公司的大数据平台(DataX)导数,已经开发上线一个多月的一批报表,突然有同事说有个报表数据不准。出在时间字段上。
分析:
1、先看了原数据MySQL字段类型为datetime,目标字段为timestamp类型;
2、经发现所有时间的差距都是8小时,怀疑是因为时区转换的原因;
3、对比其他表,看看是大范围现象还是特殊情况,发现其他的同样情况字段的一样没有问题,也有改变为string字段类型的也没有问题;

测试

MySQL 数据信息

MySQL表名:test
MySQL字段类型如下:

field_name type
id int
name varchar
creat_day_time datetime
create_day date
create_time time
create_time_stamp timestamp
-----测试数据如下
id    name               create_day_time         create_day   create_time   create_time_stamp
1	  xiaoming           2023-04-10 14:20:42     2023-04-10   14:20:42      2023-04-10 14:20:42
2     xiaohong           2023-04-21 14:21:02     2023-04-21   14:21:02      2023-04-21 14:21:02

HIVE数据信息

hive中用 text 文件格式存储
hive 表名:test_text

field_name type
id int
name string
creat_day_time string
create_day string
create_time string
create_time_stamp string
-----hive 表中的数据:
id    name               create_day_time         create_day   create_time   create_time_stamp
1	  xiaoming           2023-04-10 14:20:42     2023-04-10   14:20:42      2023-04-10 14:20:42
2     xiaohong           2023-04-21 14:21:02     2023-04-21   14:21:02      2023-04-21 14:21:02

与mysql表里面数据一致;

hive中用 parquet(orc) 列式文件格式存储

hive表名:test_parquet
导入hive命令:

field_name type
id int
name string
creat_day_time string
create_day string
create_time string
create_time_stamp string
-----hive 表中的数据:
id    name               create_day_time         create_day      create_time   create_time_stamp
1	  xiaoming           1681107642000           1681056000000   22842000      1681107642000
2     xiaohong           1682058062000           1682006400000   22862000      1682058062000

结论:
1、sqoop(DataX) 导 mysql 到 hive以text文件格式存储时,mysql时间类型:datetime,date,time,timestamp 会被转成 hive 的 string 类型,值保存格式化后的时间字符串
2、sqoop(DataX) 导 mysql 到 hive以parquet(orc)l列式文件格式存储时,mysql时间类型:datetime,date,time,timestamp 会被转成 hive的相应类型,值保存时间戳

解决方法

hive表存储格式为:行式存储(text)格式,hive表相应字段(mysql里面datetime字段)设置为string类型;

问题2:

mysql表中字段类型是tinyint(1),同步到hive中,也会显示出布尔类型,就是true和false。

官网解释如下:
Mysql中存在tinyint(1)时,在数据导入到HDFS时,该字段默认会被转化为boolean数据类型,导致数据内容丢失(都变为NULL)。

解决方法

1、可以在mysql中在建立一张表,将新建立的表修改为int类型,之后在进行同步。

2、修改sqoop的同步脚本。
解决方案:
在–connect参数后的jdbc连接上添加参数:tinyInt1isBit=false
注意:
若有多个参数,需要使用双引号将整个参数值括起来

如:–connect " jdbc:mysql://ip:3306/db?serverTimezone=Asia/Shanghai&tinyInt1isBit=false "

相关推荐

  1. sqoop(DataX)-MySQL导入HIVE时间问题

    2024-01-06 13:26:02       38 阅读
  2. mysql时间处理问题

    2024-01-06 13:26:02       31 阅读
  3. Mysql数据库中表名和数据导入hive数据库中

    2024-01-06 13:26:02       26 阅读
  4. MySQL导入/导出数据

    2024-01-06 13:26:02       20 阅读
  5. mysql数据导出导入

    2024-01-06 13:26:02       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-06 13:26:02       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-06 13:26:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-06 13:26:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-06 13:26:02       18 阅读

热门阅读

  1. 全志F1C100s Linux 系统编译出错:不能连接 github

    2024-01-06 13:26:02       47 阅读
  2. BAM文件数据结构详解

    2024-01-06 13:26:02       36 阅读
  3. leetcode 93. 复原 IP 地址

    2024-01-06 13:26:02       46 阅读
  4. python中使用socket服务发送接收图像

    2024-01-06 13:26:02       32 阅读
  5. Jtti:为什么建议企业使用存储型服务器?

    2024-01-06 13:26:02       35 阅读
  6. A Tour of Go部分练习

    2024-01-06 13:26:02       39 阅读
  7. 设置模式:适配器模式

    2024-01-06 13:26:02       34 阅读
  8. Linux平台下gcc安装升级

    2024-01-06 13:26:02       44 阅读
  9. Kendo UI for Angular 学习笔记

    2024-01-06 13:26:02       42 阅读
  10. Redhat(liunx)连接虚拟机

    2024-01-06 13:26:02       23 阅读