sqoop使用不同的列名称、列数和列顺序从配置单元导出到oracle

wbgh16ku  于 2021-06-03  发布在  Sqoop
关注(0)|答案(3)|浏览(686)

场景是这样的,我有一个包含10列的配置单元表。我想使用sqoop将数据从配置单元表导出到oracle表。
但是目标oracle表有30列,它们的名称与配置单元表列不同。而且,oracle表中的列位置与hive表中的列位置不同。
有谁能建议我如何为这种情况编写sqoop导出命令吗?

kdfy810k

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作业失败。

tcbh2hod

tcbh2hod2#

有两种选择:
到目前为止,sqoop导出是非常有限的(考虑到这不是预期的功能,而是相反的),它只提供了指定 --export-dir 表的仓库目录。它加载所有列。因此,您可能需要加载到一个staging表中,并将其加载到具有相关列Map的原始基表中。
可以使用以下方法从配置单元导出数据:

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

然后使用oracle的本机导入工具。这就提供了更多的灵活性。
如果您有更好的解决方案,请更新。

pcww981p

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"

相关问题