sqoop 日期到 impala 时间戳
sqoop date to impala timestamp
我正在使用 sqoop 将数据从 MySQL 导入到 hdfs 作为 parquet 文件供 Impala 使用。将 MySQL DATE 类型转换为 Impala TIMESTAMP 时出现问题。
Impala执行compute stats table
或select *
时的错误信息是:
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特定时间戳
我正在使用 sqoop 将数据从 MySQL 导入到 hdfs 作为 parquet 文件供 Impala 使用。将 MySQL DATE 类型转换为 Impala TIMESTAMP 时出现问题。
Impala执行compute stats table
或select *
时的错误信息是:
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特定时间戳