问题描述
jdbc报错:Caused by: java.sql.SQLException: Zero date value prohibited
Caused by: com.mysql.cj.exceptions.DataReadException: Zero date value prohibited
使用sqoop将mysql数据抽取至hive时,或在其他场景使用jdbc场景中,由于数据库中有非法零值date而导致报错,零值date比如:0000-00-00 00:00:00
其实错误发生在sqoop使用JDBC连接mysql读数据的时候,在一行一行读取时,会自动判断是否可写入,如果有非法值就会报错
解决方案:
在JDBC配置中添加zeroDateTimeBehavior 属性,当遇到datetime值完全由0组成时,最终的有效值可以设置为,异常(exception),一个近似值(round),或将这个值转换为null(convertToNull)。
jdbc:mysql://{host}:{port}/{databasse}?zeroDateTimeBehavior=convertToNull
完整的sqoop语句如下:
sqoop import --connect 'jdbc:mysql://{host}:{port}/{databasse}?zeroDateTimeBehavior=convertToNull' \
--username '用户名' \
--password '密码' \
--driver com.mysql.cj.jdbc.Driver \
--query 'sql语句' \
--hcatalog-database hive库名 \
--hcatalog-table hive表名 \
zeroDateTimeBehavior有三个参数:exception、 convertToNull、 round
1.exception:默认设置为exception,在遇到零值日期会抛出一个SQLException异常,其SQLSate码为S1009;
2. convertToNull :数据库会返回 null来代替 0000-00-00 这样的无效日期;
3. round:数据库 会将日期转换为0001-01-01 返回;