【问题标题】:Incremental data load to hive table将增量数据加载到 hive 表
【发布时间】:2015-12-21 11:32:44
【问题描述】:

我正在尝试将增量数据从一个配置单元外部表加载到另一个配置单元表。我在源表上有一个日期时间戳字段,用于每天识别新添加的行。我的任务是提取新添加到源中的行并将它们插入到目标表中。

我正在使用 Hive 0.14。

我尝试了以下查询,但无法正常工作。

INSERT INTO TABLE TARGET PARTITION (FIELD_DATE)
SELECT A.FIELD1, A.FIELD2, A.FIELD3,
CASE WHEN LENGTH(A.FIELD4)=0 THEN 0 ELSE 1 END,
CASE WHEN LENGTH(A.FIELD5)=0 THEN 0 ELSE 1 END,
FROM SOURCE A, (Select max(FIELD_TIMESTAMP) from TARGET) T
where A.FIELD_TIMESTAMP > T.FIELD_TIMESTAMP;

上面的代码花了几个小时没有给出任何结果。

我也尝试执行下面的查询,后来发现 HIVE 不支持 WHERE 子句中的子查询。 (得到 ParseException)

INSERT INTO TABLE TARGET PARTITION (FIELD_DATE)
SELECT A.FIELD1, A.FIELD2, A.FIELD3,
CASE WHEN LENGTH(A.FIELD4)=0 THEN 0 ELSE 1 END,
CASE WHEN LENGTH(A.FIELD5)=0 THEN 0 ELSE 1 END,
FROM SOURCE A, TARGET T
where A.FIELD_TIMESTAMP > (Select max(FIELD_TIMESTAMP) from TARGET);

请帮助我仅选择初始加载后添加的行。

谢谢。

【问题讨论】:

    标签: hadoop hive load


    【解决方案1】:

    试试这个

    INSERT INTO TABLE TARGET PARTITION (FIELD_DATE)
    SELECT A.FIELD1, A.FIELD2, A.FIELD3,
    CASE WHEN LENGTH(A.FIELD4)=0 THEN 0 ELSE 1 END,
    CASE WHEN LENGTH(A.FIELD5)=0 THEN 0 ELSE 1 END,
    FROM SOURCE A JOIN 
    (Select max(FIELD_TIMESTAMP) as FIELD_TIMESTAMP from TARGET) T
    on 1=1
    where A.FIELD_TIMESTAMP > T.FIELD_TIMESTAMP;
    

    这是供您参考的测试查询:

    insert into orders_target
    select o.* from orders_source o join
    (select max(o1.order_date) order_date from orders_target o1) o2
    on 1=1
    where o.order_date > o2.order_date;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      相关资源
      最近更新 更多