【问题标题】:sqoop date to impala timestampsqoop 日期到 impala 时间戳
【发布时间】:2016-01-08 15:52:42
【问题描述】:

我使用 sqoop 将数据从 MySQL 导入 hdfs,作为 Impala 使用的 parquet 文件。将 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 并在 sqoop 中设置 --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?

【问题讨论】:

    标签: mysql hadoop timestamp sqoop impala


    【解决方案1】:

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

    【讨论】:

    • 我不确定如何在 --map-column-java "day=???" 中使用它,顺便说一句。字符串在 Impala 中产生 BYTE_ARRAY
    • 确实如此。 Impala 对 TIMESTAMP 使用 INT96,但 sqoop 不使用该映射(仅到 INT64)并且 java 不支持 INT96,因此无法覆盖映射
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      转换为 impala 特定的时间戳

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-28
        • 2010-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多