使用 sqoop 将选定数据从 oracle db 导入 S3,并在 AWS EMR 上使用选定数据创建配置单元表脚本

Posted

技术标签:

【中文标题】使用 sqoop 将选定数据从 oracle db 导入 S3,并在 AWS EMR 上使用选定数据创建配置单元表脚本【英文标题】:Import selected data from oracle db to S3 using sqoop and create hive table script on AWS EMR with selected data 【发布时间】:2015-09-24 11:32:49 【问题描述】:

我是大数据技术的新手。我正在处理以下要求,需要帮助以简化我的工作。

假设我在 oracle db 中有 2 个表,每个表有 500 列。我的任务是将两个表中的选定列数据(通过连接查询)移动到 AWS S3,并在 AWS-EMR 上的 hive 表中填充数据。 目前,为了满足我的要求,我按照以下步骤操作。

    在 AWS-EMR 上使用选定的列创建外部配置单元表。我知道列名,但要识别 hive 的列数据类型,我将访问 oracle 数据库表并识别 oracle 中的列类型并创建 hive 脚本。 创建表后,我正在编写带有选定查询数据的 sqoop 导入命令,并将目录目录提供给 S3。 根据 S3 数据修复表。

详细解释, 假设 T1 和 T2 是两个表,T1 从 T1_C1 到 T1_C500 有 500 列,具有各种数据类型(数字、Varchar、Date)等。同样,T2 也有从 T2_C1 到 T2_C500 的 500 列。 现在假设我想将一些列例如:T1_C23、T1_C230、T1_C239、T2_C236、T1_C234、T2_C223 移动到 S3 并为选定的列创建配置单元表并了解我需要查看 T1 和 T2 表架构的数据类型。 有没有更简单的方法来实现这一点? 在上述步骤中,第一步需要大量手动时间,因为我需要查看表架构并获取所选列的数据类型,然后创建配置单元表。

简单介绍一下工作环境。

在数据中心上运行的服务:

    Oracle 数据库

    Linux 机器上的 Sqoop。

sqoop 与 oracle db 对话并配置为在 S3 上推送数据。

在 AWS 上运行的服务:

    S3

    AWS EMR 配置单元

hive 与 S3 对话并使用 S3 数据修复表。

【问题讨论】:

【参考方案1】:

1) 为了简化 Hive 表的生成,您可以使用 Oracle 字典

SELECT t.column_name || ' ' ||
       decode(t.data_type, 'VARCHAR2', 'VARCHAR', 'NUMBER', 'DOUPLE') ||
       ' COMMENT '||cc.comments||',',
       t.*
  FROM user_tab_columns t
  LEFT JOIN user_col_comments cc
    ON cc.table_name = t.table_name
   AND cc.column_name = t.column_name
 WHERE t.table_name in ('T1','T2') 
 ORDER BY t.table_name, t.COLUMN_id;

此数据集的第一列将是您的CREATE TABLE 命令的列列表。 您需要修改 DECODE 以正确地将 Oracle 类型转换为 Hive 类型 2) 我记得sqoop很容易导出表,所以你可以在Oracle中创建视图来隐藏连接查询并通过sqoop导出这个视图:

CREATE OR REPLACE VIEW V_T1_T2 AS
SELECT * FROM T1 JOIN T2 ON ...;

【讨论】:

但是如何将其存储在 S3 中?

以上是关于使用 sqoop 将选定数据从 oracle db 导入 S3,并在 AWS EMR 上使用选定数据创建配置单元表脚本的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sqoop 将视图(数据库表重)从 Oracle 迁移到 Hive

Sqoop简单回顾总结

使用 MapReduce 或 Sqoop 将数据加载到 Greenplum DB

尝试使用 Sqoop 从 DB2 获取数据到 Hbase 非常慢

sqoop从oracle导数据后是空表

怎么把数据从oracle11迁到oracle12