sqoop 日期到 impala 时间戳

sqoop date to impala timestamp

我正在使用 sqoop 将数据从 MySQL 导入到 hdfs 作为 parquet 文件供 Impala 使用。将 MySQL DATE 类型转换为 Impala TIMESTAMP 时出现问题。

Impala执行compute stats tableselect *时的错误信息是:

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

将 day 列的数据类型更改为 BIGINT 或 STRING 会使错误消息保持不变。

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

Expected type: INT32.  Actual type: BYTE_ARRAY in Impala

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

使用parquet文件时,如何使用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 日期转换为

--query "SELECT UNIX_TIMESTAMP(STR_TO_DATE(day, '%Y-%m-%d'))

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

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

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

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

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

转换为impala特定时间戳