【问题标题】:Sqoop export from hive to oracle with different col names, number of columns and order of columnsSqoop 从 hive 导出到 oracle,具有不同的列名、列数和列顺序
【发布时间】:2019-01-05 06:11:30
【问题描述】:

场景就像,我有一个有 10 列的配置单元表。我想使用 Sqoop 将数据从我的 hive 表导出到 oracle 表。

但目标 oracle 表有 30 个列,其名称与 hive 表列不同。此外,oracle 表中的列位置与 hive 表中的不同。

谁能建议我如何为这种情况编写 Sqoop 导出命令?

【问题讨论】:

    标签: sqoop


    【解决方案1】:

    尝试下面,假设您的 hive 表是作为外部表创建的,并且您的数据位于 /myhivetable/data/ ,字段由 | 终止并且行以'\n'结尾。

    在您的 RDBMS 表中,不会从 hive HDFS 填充的 20 列应该具有默认值或允许空值。

    假设您的数据库列是 DC1,DC2,D4,DC5 ....D20,hive 列是 c1,c2,c3,c3,......c10,您的映射如下。

    DC1  -- c8
    DC2  -- c1
    DC3  -- c2
    DC4  -- c4
    DC5  -- c3
    DC6  -- c7
    DC7  -- c10
    DC8  -- c9
    DC9  -- c5
    DC10 -- c6
    
    
     sqoop export \
      --connect jdbc:postgresql://10.10.11.11:1234/db \
      --table table1 \
      --username user \
      --password pwd \
      --export-dir /myhivetable/data/ \
      --columns "DC2,DC3,DC5,DC4,DC9,DC10,DC6,DC1,DC8,DC7" \
      --fields-terminated-by '|' \
      --lines-terminated-by '\n' \
      --input-null-string "\\\\N" \
      --input-null-non-string "\\\\N"
    

    【讨论】:

      【解决方案2】:

      首先,不能将数据直接从hive导出到oracle。

      您需要将配置单元表导出到 HDFS

      • 示例命令:

        export table mytable to 'some_hdfs_location'
        

      或者使用 Hive 表的 HDFS 数据位置。

      • 检查位置的命令

        show create table mytable
        

      所以现在您有了 Hive 表的数据位置。


      您可以在 Sqoop 导出命令中使用--columns 标签来选择列顺序和编号。

      列名不同没有问题。

      我举个简单的例子

      现在您有了带有列的 hive 表 - c1、c2、c3

      和 Oracle 表 - col1、col2、col3、col4、col5

      我想将 c1 映射到 col2,c2 映射到 col5,c3 映射到 col1。

      我将在我的 sqoop 命令中使用--columns "col2,col5,col1"

      根据 Sqoop docs

      默认情况下,选择表中的所有列进行导出。您可以使用 --columns 参数选择列的子集并控制它们的顺序。这应该包括以逗号分隔的要导出的列列表。例如:--columns "col1,col2,col3"。请注意,未包含在 --columns 参数中的列需要具有定义的默认值或允许 NULL 值。否则您的数据库将拒绝导入的数据,这反过来会导致 Sqoop 作业失败。

      【讨论】:

      • 能否请您为上述示例提供任何示例 sqoop 导出命令?
      • @dev 如果有一个 hive 表,它的数据将存储在 HDFS 位置(通常在一些目录,如 hive 仓库)对吗?那么,如果我们尝试通过提及 hive 仓库位置而不是将数据从 Hive 带到 HDFS 并进行导出来尝试导出呢?不行吗?
      • @JKC 是的,它会起作用。我将用这个澄清来编辑我的答案:)
      • @devツ 非常感谢您的意见。你能帮我解决这个问题吗?我有一个包含两列的配置单元表,当我们看到底层 HDFS 位置时,它在两个字段之间没有任何分隔符。所以数据是连续的。我在 RDBMS 中创建了一个包含两列和相似数据类型的表。在这种情况下,如何在不指定分隔符的情况下将此配置单元表内容导出到 RDBMS?
      • @JKC 配置单元表的默认分隔符是 CTRL-A。 hive shell 中show create table table_name 的输出是什么
      【解决方案3】:

      有两种选择:

      1. 到目前为止,sqoop 导出非常有限(认为因为这不是太多预期的功能,而是其他方式),它只提供指定--export-dir 的选项,这是表的仓库目录。它会加载所有列。因此,您可能需要加载到临时表中并将其加载到具有相关列映射的原始基表中。

      2. 您可以使用以下命令从 Hive 导出数据:

        INSERT OVERWRITE DIRECTORY '/user/hive_exp/orders' select column1, column2 from hivetable;
        

        然后使用 Oracle 的原生导入工具。这提供了更大的灵活性。

      如果您有更好的解决方案,请更新。

      【讨论】:

      • --columns col1, col2 是导出期间目标表(oracle)中的列。因为sqoop export没有指定Hive导出,所以我们不是指任何Hive表,我们只是指Hive数据位置。
      猜你喜欢
      • 2016-09-05
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      相关资源
      最近更新 更多