sqoop日期到impala时间戳

时间:2016-01-08 15:52:43

标签: mysql hadoop timestamp sqoop impala

我将使用sqoop从MySQL导入数据到hdfs作为镶嵌文件,Impala使用它。将MySQL DATE类型转换为Impala TIMESTAMP存在问题。

执行compute stats tableselect *时出现Impala错误消息:

File 'hdfs://....parquet'
has an incompatible type with the table schema for column 'day'.
Expected type: INT32.  Actual type: INT64

将日期列的数据类型更改为BIGINT或STRING会使错误消息相同。

即使我将Impala中的日期列类型更改为STRING并设置--map-column-java" day = String" (也试过day = Integer和Long)在sqoop中得到:

Expected type: INT32.  Actual type: BYTE_ARRAY in Impala

我也尝试在jdbc连接字符串中设置mapDateToTimestamp = false(和true)但没有效果

使用镶木地板文件时,使用sqoop将MySQL DATE转换为Impala TIMESTAMP的方法是什么(注意我没有使用AVRO)?

(我使用的sqoop版本是1.4.5-cdh5.3.3) Sqoop命令如下所示:

sqoop import
--connect jdbc:mysql://adress/db
--username name
--password pass
--table tableName
--target-dir dir
--as-parquetfile -m 1
--driver com.mysql.jdbc.Driver

编辑:我尝试用

转换SQL Date
--query "SELECT UNIX_TIMESTAMP(STR_TO_DATE(day, '%Y-%m-%d'))

但Impala将其视为INT64并期望INT96。那么另一个问题是如何将其转换为INT96?

3 个答案:

答案 0 :(得分:0)

你试过INT96吗? 我也认为您无法将TINYINT,SMALLINT列转换为BIGINT

答案 1 :(得分:0)

看起来唯一的方法是使用--map-column-java "day=String"并在Impala中将该列作为STRING,并使用cast()函数进行日期查询或使用临时表。

答案 2 :(得分:0)

通常我们遵循的是当我们从scoop或其他外部系统导入时,所有数据类型将在登陆后默认为字符串(登陆)我们将使用

from_unixtime(unix_timestamp(<datecol>,yyyyMMdd'),'yyyy-MM-dd')

转换为impala特定时间戳