2016-09-29 57 views

回答

0

有2个选项:

  1. 截至目前,sqoop出口是非常有限的(思维,因为这是没有太大的预期功能,但周围的其他方式),它给指定--export-dir这是唯一的选择表的仓库目录。它会加载所有列。因此,您可能需要将其加载到临时表&,并使用相关列映射将其加载到原始基表中。

  2. 您可以从蜂巢使用导出数据:

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

    然后使用Oracle的本地导入工具。这给了更多的灵活性。

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

+0

'--col col1,col2'是导出过程中目标表(oracle)中的列。因为'sqoop export'没有指定Hive导出,所以我们不是指任何Hive表,我们只是指的是蜂巢数据的位置。 – KiranM

0

首先,你不能直接从配置单元导出数据到oracle。

需要导出蜂巢表HDFS

  • 样本命令:

    export table mytable to 'some_hdfs_location' 
    

或使用您的蜂巢表的HDFS数据位置。

  • 命令检查位置

    show create table mytable 
    

所以,现在你有数据的位置,为您的蜂巢表。


可以在Sqoop导出使用--columns tag命令选择列的顺序和数量。

不同的列名称没有问题。

我以简单的例子

现在你有一个列蜂房表 - 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作业失败。

+1

你能举出上面例子给出的任何示例sqoop export命令吗? –

+0

@dev如果有一个配置单元表,它的数据将被存储在HDFS位置(通常在像hive仓库这样的目录中)对吗?那么,如果我们试图通过提及配置单元仓库位置而不是将Hive中的数据引入HDFS并执行导出来尝试导出,那该怎么办呢?它不会起作用吗? – JKC

+0

@JKC是的,它会工作。我会用这个澄清来编辑我的答案:) –

0

请尝试下面的内容,假设您的配置单元表是作为外部表创建的,并且您的数据位于/ myhivetable/data /中,则字段以|并且行以'\ n'结尾。

在你的RDBMS表中,不会从配置单元HDFS填充的20列应该有默认值或允许空值。

让我们假设您的数据库列是DC1,DC2,D4,DC5 .... D20和配置单元列是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" 
相关问题