【发布时间】:2019-01-05 06:11:30
【问题描述】:
场景就像,我有一个有 10 列的配置单元表。我想使用 Sqoop 将数据从我的 hive 表导出到 oracle 表。
但目标 oracle 表有 30 个列,其名称与 hive 表列不同。此外,oracle 表中的列位置与 hive 表中的不同。
谁能建议我如何为这种情况编写 Sqoop 导出命令?
【问题讨论】:
标签: sqoop
场景就像,我有一个有 10 列的配置单元表。我想使用 Sqoop 将数据从我的 hive 表导出到 oracle 表。
但目标 oracle 表有 30 个列,其名称与 hive 表列不同。此外,oracle 表中的列位置与 hive 表中的不同。
谁能建议我如何为这种情况编写 Sqoop 导出命令?
【问题讨论】:
标签: sqoop
尝试下面,假设您的 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"
【讨论】:
首先,不能将数据直接从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 作业失败。
【讨论】:
show create table table_name 的输出是什么
有两种选择:
到目前为止,sqoop 导出非常有限(认为因为这不是太多预期的功能,而是其他方式),它只提供指定--export-dir 的选项,这是表的仓库目录。它会加载所有列。因此,您可能需要加载到临时表中并将其加载到具有相关列映射的原始基表中。
您可以使用以下命令从 Hive 导出数据:
INSERT OVERWRITE DIRECTORY '/user/hive_exp/orders' select column1, column2 from hivetable;
然后使用 Oracle 的原生导入工具。这提供了更大的灵活性。
如果您有更好的解决方案,请更新。
【讨论】:
--columns col1, col2 是导出期间目标表(oracle)中的列。因为sqoop export没有指定Hive导出,所以我们不是指任何Hive表,我们只是指Hive数据位置。