【问题标题】:Hive and Sqoop partitionHive 和 Sqoop 分区
【发布时间】:2015-01-28 20:48:22
【问题描述】:

我有来自 Netezza 表的 sqoopd 数据,输出文件在 HDFS 中,但有一列是时间戳,我想将其作为日期列加载到我的配置单元表中。使用该列我想在日期创建分区。我该怎么做?

示例:HDFS 中的数据就像 = 2013-07-30 11:08:36

在 hive 中,我只想加载日期 (2013-07-30) 而不是时间戳。我想每天对该列进行分区。

如何动态地按列传递分区?

我尝试将数据加载到一个表中作为源。在最终表中,我将通过 (date_column=dynamic date) select * from table1 插入覆盖表分区

【问题讨论】:

    标签: hadoop hive sqoop sqoop2


    【解决方案1】:

    设置这两个属性 -

    SET hive.exec.dynamic.partition=true;
    SET hive.exec.dynamic.partition.mode=nonstrict;
    

    查询可以像 -

    INSERT OVERWRITE TABLE TABLE PARTITION (DATE_STR)
    SELECT 
      :
      :
     -- Partition  Col is the last column 
      to_date(date_column) DATE_STR
    FROM table1;
    

    您可以探索 hive-import 的两个选项 - 如果它是 incremental import,您将能够获取当天的分区。

    --hive-partition-key    
    --hive-partition-value 
    

    【讨论】:

    • 嗨,谢谢你的信息。我试过 to_date(daye_column) ...partition col 是 table1 中的最后一列 to_date(date_column) date_str ..但它不起作用。它给出解析异常 to_date (col_name)
    • 有什么办法可以只写入新的或更新的列,而不是插入覆盖......不要在表中重新写入所有数据
    • 可能日期格式不正确 - 检查任务跟踪日志。 Sqoop 有这个增量导入选项 - sqoop.apache.org/docs/1.4.3/… 您可以探索 hive-import 的两个选项 - 如果是增量导入,您将能够获取当天的分区。 --hive-partition-key --hive-partition-value
    【解决方案2】:

    您可以通过启用动态分区并使用 to_date 日期函数将时间戳转换为日期来从 EMP 加载 EMP_HISTORY 表

    代码可能看起来像这样......

    SET hive.exec.dynamic.partition=true;
    SET hive.exec.dynamic.partition.mode=nonstrict;
    
    INSERT OVERWRITE TABLE EMP_HISTORY PARTITION (join_date)
        SELECT e.name as name, e.age as age, e.salay as salary, e.loc as loc, to_date(e.join_date) as join_date from EMP e ;
    

    【讨论】: