【问题标题】:Sqoop incrementalSqoop 增量
【发布时间】:2020-05-14 02:53:20
【问题描述】:

Sqoop 是否可以在数据类型为timestamp(6) 的加载时间的基础上对 teradata 进行增量加载?在 hdfs 中加载时如何处理格式:

sql exxeption:- 期待一些 '(' 和 ')。

【问题讨论】:

    标签: hdfs sqoop sqoop2


    【解决方案1】:

    所以你有一列是 loadtime [type timestamp(6)]。
    在将数据拉到 HDFS 时,您必须创建一个 3 步过程。还必须在 hdfs 端创建分区。
    我更喜欢这种方式,因为您不会弄乱旧数据。
    但是你可以在 sqoop 中使用--incremental 选项。

    1. 获取 hdfs 中存在的最大加载时间。如果这是第一次传递一个默认值,例如 0000-00-00 00:00:00.000000
    2. 通过 sqoop 拉取数据时,添加一个条件传递 WHERE loadtime > ${max_of_loadtime_in_hdfs}。您将传递 max_of_loadtime_in_hdfs 作为参数。
    3. 将数据保存在较新的分区中

    现在,teradata 和 hive 的时间戳格式会有所不同。
    保存到 hive 时最好转换为字符串。

    因此,在使用配置单元加载时间(字符串类型)检查加载时间时,您必须 cast back 到时间戳(6)。
    所以在你的情况下,sqoop 结束将是(这对你有用):

    • WHERE loadtime > CAST(${max_of_loadtime_in_hdfs} AS TIMESTAMP(6))
    • WHERE loadtime > TO_TIMESTAMP(${max_of_loadtime_in_hdfs}, 'yyyy-mm-dd hh24:mi:ss.ff6')

    ma​​x_of_loadtime_in_hdfs 会是这样的 2020-12-31 23:59:59.999999

    所以在你最后的 sqoop 查询中:

    SELECT
        column_A,
        column_B,
        ...
        column_N,
        to_char(loadtime, 'yyyy-mm-dd hh24:mi:ss.ff6') loadtime
    FROM teradata_table
    WHERE loadtime > TO_TIMESTAMP(${max_of_loadtime_in_hdfs}, 'yyyy-mm-dd hh24:mi:ss.ff6') 
    AND $CONDITIONS --this is for sqoop don’t remove this
    

    hive 表定义:

    CREATE EXTERNAL TABLE teratable_in_hive (
        column_A <column_A_datatype>,
        column_B <column_B_datatype>,
        ...
        column_N <column_N_datatype>,
        loadtime string
    )
    PARTITIONED BY (pull_seq_no <type can be int or string>)
    STORED AS <file_format TEXTFILE / PARQUET>
    LOCATION 'hdfs:///<some-path>/teratable_in_hive'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-28
      • 2016-03-27
      • 2015-08-31
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多