场景就像,我有一个10列的蜂巢表。我想使用Sqoop将数据从我的hive表导出到oracle表。
但是目标oracle表有30列,其名称与hive表列不同。此外,oracle表中的列位置与hive表中的列位置不同。
任何人都可以建议我如何为这种情况编写Sqoop导出命令?
答案 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)
有两个选项:
截至目前,sqoop导出非常有限(考虑因为这不是很多预期的功能,而是其他方式),它只提供指定--export-dir
这个表的仓库目录的选项。它加载所有列。所以你可能需要加载到临时表和&使用相关列映射将其加载到原始基表中。
您可以使用以下方法从Hive导出数据:
INSERT OVERWRITE DIRECTORY '/user/hive_exp/orders' select column1, column2 from hivetable;
然后使用Oracle的本机导入工具。这提供了更大的灵活性。
如果您有更好的解决方案,请更新。