我将使用sqoop从MySQL导入数据到hdfs作为镶嵌文件,Impala使用它。将MySQL DATE类型转换为Impala TIMESTAMP存在问题。
执行compute stats table
或select *
时出现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?
答案 0 :(得分:0)
答案 1 :(得分:0)
看起来唯一的方法是使用--map-column-java "day=String"
并在Impala中将该列作为STRING,并使用cast()
函数进行日期查询或使用临时表。
答案 2 :(得分:0)
通常我们遵循的是当我们从scoop或其他外部系统导入时,所有数据类型将在登陆后默认为字符串(登陆)我们将使用
from_unixtime(unix_timestamp(<datecol>,yyyyMMdd'),'yyyy-MM-dd')
转换为impala特定时间戳