【问题标题】:Hive table dynamic partition load using Sqoop使用 Sqoop 加载 Hive 表动态分区
【发布时间】:2016-08-26 12:41:07
【问题描述】:

我有一个名为 dept 的 MySQL 表,我将其加载到 Hive EXTERNAL 表 dept 表中,作为基于时间戳列 ts 的增量附加检查列最后值。

这工作正常,现在我想根据dept_namets 列将动态分区添加到我的配置单元表dept

我知道我可以在 sqoop 之外创建表动态分区,但在将数据加载到动态分区时需要帮助。我看到了一个使用--hive-partition-key--hive-partition-value 的示例,但是该值是硬编码的。如果不对 hive-partition-values 进行硬编码,我可以使用 SQOOP 自动将数据加载到相应的分区,比如 (dept1,timestamp1/dept1,timestamp2..etc) 和 (dept2,timestamp1/dept2,timestamp2...etc)?

【问题讨论】:

    标签: hive sqoop


    【解决方案1】:

    是的,您可以将已创建的外部表中的数据加载到动态分区表中,而无需对分区值进行硬编码。

    假设您已经拥有带有值的外部表externalDept,并且您已经创建了分区表dept,您可以使用如下内容:

    INSERT OVERWRITE TABLE dept 
    PARTITION (dept_name, ts)
    SELECT ..., ed.dept_name, ed.ts
    FROM externalDept ed
    

    这不是您的问题的一部分,但您也可以混合使用静态和动态分区。例如,如果您想为timestamp 指定一个动态值,而为dept 指定一个静态值,您可以执行以下操作:

    INSERT OVERWRITE TABLE dept 
    PARTITION (dept_name = 'Math', ts)
    SELECT ..., ed.dept_name, ed.ts
    FROM externalDept ed
    WHERE ed.dept_name = 'Math'
    

    【讨论】:

    • 谢谢 Jaime。我的要求是将所有当前 MySQL 表数据移动到 Hive 表,然后根据 MySQL 表中发生的每日插入/更新,我想将所有此类记录加载到 HIVE 表中。所以对于历史加载,正如您提到的,我可以先将所有 MySQL 数据移动到 HIVE 外部表,然后根据 dept_name 和 ts 加载到动态分区表。对于增量加载,最好的方法是什么?
    • 据我所知,没有任何“简单直接”的方法可以做到这一点。目前,Sqoop 不支持导入动态分区 (issues.apache.org/jira/browse/SQOOP-312),所以我会采用类似这样的方法 (docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.4.0/…),在这种方法中,您可以每天将“新”数据加载到外部表中 (就像初始加载一样),然后在 Hive 表中使用INSERT(没有OVERWRITE)。
    • 谢谢。我有50个不同的部门名称。这就是为什么我计划根据部门名称和时间戳进行分区。我总是在WHERE子句中使用部门名称进行查询。你认为我的分区方法很好还是有更好的方法?假设我的员工 id 也是这条记录的一部分,它是字符串(不是整数),在员工 id 列上添加分桶会更好吗?任何这样的例子你可以帮忙吗?
    • 关于您的第一个问题,我认为假设您的行或多或少均匀分布在不同的 50 个部门之间,这很好。因此,这取决于您的分区键将“拆分”数据的方式(对称或非对称),但dept 分区方法听起来不错。至于第二个问题,我认为根据employee_id 添加分桶级别没有任何问题,据我所知,这是最“典型”的方法之一。
    • 这个 (hadooptutorial.info/bucketing-in-hive/…) 可能会有所帮助。
    猜你喜欢
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2017-07-12
    相关资源
    最近更新 更多