sqoop mysql parquet,sqoop – import导入parquet的坑

本文介绍了使用sqoop从MySQL导入数据到Parquet时遇到的坑点,包括JDBC类型问题(如tinyint变为boolean,datetime处理错误),datetime空值问题,unsigned类型问题,以及sqoop导入空目录导致的Hive加载失败问题。解决方案包括调整JDBC参数,使用date_format转换,检查Parquet schema,并编写shell脚本来避免空目录加载。
摘要由CSDN通过智能技术生成

sqoop import导入mysql数据时使用parquet是为了列存压缩节约磁盘空间,但parquet本身是类似于protocolbuf的强schema格式,每一列的数据类型都是明确定义的,这就带来了一些坑点,下面列举一下。

坑1:JDBC类型问题

sqoop导入mysql时是使用JDBC连接Mysql,然后将数据读取回内存里保存到Java数据类型里,这里面就存在一个类型问题。

tinyint问题

首先是发现mysql的tinyint字段,经过JDBC读取后变成了boolean类型(发现该问题的过程后续说),定位是因为JDBC有一个选项叫做:

tinyInt1isBit=true

默认为true,它会将只有0和1值的tinyint字段存储到java的boolean类型中,最终导致写入parquet时的schema也变成了boolean类型,而我建hive表时还傻傻的用tinyint,导致hive读取parquet文件报错。

datetime类型问题

接下来发现mysql的datetime字段,原本应该是”2020-11-12 10:12:00″这样的字符串时间,结果jdbc读回内存时就存储到Long类型变量里了,然后导致写入parquet时将schema指定为int64,而hive建表时我采用的string类型,所以导致查询报错。

该问题没有JDBC参数可以影响行为,只能在sqoop import时对datetime字段进行一次显式的date_format操作,类似于这样:

sqoop import “select DATE_FORMAT(create_time, ‘%Y-%m-%d %H:%i:%s’)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值