场景是这样的,我有一个包含10列的配置单元表。我想使用sqoop将数据从配置单元表导出到oracle表。但是目标oracle表有30列,它们的名称与配置单元表列不同。而且,oracle表中的列位置与hive表中的列位置不同。有谁能建议我如何为这种情况编写sqoop导出命令吗?
kdfy810k1#
首先,不能将数据直接从配置单元导出到oracle。您需要将配置单元表导出到hdfs示例命令:
export table mytable to 'some_hdfs_location'
或者使用hive表的hdfs数据位置。检查位置的命令
show create table mytable
所以现在您有了配置单元表的数据位置。你可以用 --columns 在sqoop export命令中标记以选择列顺序和编号。不同的列名没有问题。我举个简单的例子现在您有了一个包含列-c1、c2、c3的配置单元表以及oracle表-col1、col2、col3、col4、col5我想用col2Mapc1,用col5Mapc2,用col1Mapc3。我将使用 --columns "col2,col5,col1" 在我的sqoop命令中。根据sqoop文件,默认情况下,选择表中的所有列进行导出。可以使用--columns参数选择列的子集并控制它们的顺序。这应该包括要导出的列的逗号分隔列表。例如:--列“col1,col2,col3”。请注意,--columns参数中未包含的列需要定义默认值或允许空值。否则,您的数据库将拒绝导入的数据,这将导致sqoop作业失败。
--columns
--columns "col2,col5,col1"
tcbh2hod2#
有两种选择:到目前为止,sqoop导出是非常有限的(考虑到这不是预期的功能,而是相反的),它只提供了指定 --export-dir 表的仓库目录。它加载所有列。因此,您可能需要加载到一个staging表中,并将其加载到具有相关列Map的原始基表中。可以使用以下方法从配置单元导出数据:
--export-dir
INSERT OVERWRITE DIRECTORY '/user/hive_exp/orders' select column1, column2 from hivetable;
然后使用oracle的本机导入工具。这就提供了更多的灵活性。如果您有更好的解决方案,请更新。
pcww981p3#
尝试下面的方法,假设您的配置单元表是作为外部表创建的,并且您的数据位于/myhivetable/data/,字段以|结尾,行以'\n'结尾。在rdbms表中,不从hivehdfs填充的20列应该有默认值或允许空值。假设您的数据库列是dc1、dc2、d4、dc5….d20,而配置单元列是c1、c2、c3、c3….c10,您的Map如下所示。
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"
3条答案
按热度按时间kdfy810k1#
首先,不能将数据直接从配置单元导出到oracle。
您需要将配置单元表导出到hdfs
示例命令:
或者使用hive表的hdfs数据位置。
检查位置的命令
所以现在您有了配置单元表的数据位置。
你可以用
--columns
在sqoop export命令中标记以选择列顺序和编号。不同的列名没有问题。
我举个简单的例子
现在您有了一个包含列-c1、c2、c3的配置单元表
以及oracle表-col1、col2、col3、col4、col5
我想用col2Mapc1,用col5Mapc2,用col1Mapc3。
我将使用
--columns "col2,col5,col1"
在我的sqoop命令中。根据sqoop文件,
默认情况下,选择表中的所有列进行导出。可以使用--columns参数选择列的子集并控制它们的顺序。这应该包括要导出的列的逗号分隔列表。例如:--列“col1,col2,col3”。请注意,--columns参数中未包含的列需要定义默认值或允许空值。否则,您的数据库将拒绝导入的数据,这将导致sqoop作业失败。
tcbh2hod2#
有两种选择:
到目前为止,sqoop导出是非常有限的(考虑到这不是预期的功能,而是相反的),它只提供了指定
--export-dir
表的仓库目录。它加载所有列。因此,您可能需要加载到一个staging表中,并将其加载到具有相关列Map的原始基表中。可以使用以下方法从配置单元导出数据:
然后使用oracle的本机导入工具。这就提供了更多的灵活性。
如果您有更好的解决方案,请更新。
pcww981p3#
尝试下面的方法,假设您的配置单元表是作为外部表创建的,并且您的数据位于/myhivetable/data/,字段以|结尾,行以'\n'结尾。
在rdbms表中,不从hivehdfs填充的20列应该有默认值或允许空值。
假设您的数据库列是dc1、dc2、d4、dc5….d20,而配置单元列是c1、c2、c3、c3….c10,您的Map如下所示。