Sqoop从hive导出到oracle,具有不同的col名称,列数和列顺序

时间:2016-09-29 18:10:00

标签: sqoop

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

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

任何人都可以建议我如何为这种情况编写Sqoop导出命令?

3 个答案:

答案 0 :(得分:1)

首先,您无法将数据直接从配置单元导出到oracle。

您需要将hive表导出到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

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

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

根据Sqoop docs

  

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

答案 1 :(得分: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 :(得分:0)

有两个选项:

  1. 截至目前,sqoop导出非常有限(考虑因为这不是很多预期的功能,而是其他方式),它只提供指定--export-dir这个表的仓库目录的选项。它加载所有列。所以你可能需要加载到临时表和&使用相关列映射将其加载到原始基表中。

  2. 您可以使用以下方法从Hive导出数据:

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

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

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