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’)