【发布时间】:2017-05-19 14:00:40
【问题描述】:
我正在尝试使用 sqoop 1.4.6 将数据从 Oracle 数据库导入 HDFS。使用--table table_name 或--query SELECT <...> 语句对HDFS 或hive 表进行简单导入没有问题。
但是,我的问题是:有没有办法通过先执行某个 PL/SQL 过程来导入表?
例如,假设存在一个过程set_date(date IN DATE),该过程在 Oracle 数据库中指定,用于设置数据的报告日期。使用常用的 JDBC 工具(即,ROracle 包,如果从 R 工作),同一连接需要两个查询来提取数据:
1) BEGIN set_date(#some_date#); END;
2)SELECT * FROM table_name;
使用sqoop 是否可以达到相同的结果?我尝试通过以下方法将两个查询混合为一个:
sqoop import --connect jdbc:oracle:thin@LINK:PORT:SID \
--username user -P \
--target-dir /some/directory \
--query "BEGIN set_date(#some_date#); END; SELECT * FROM table_name"
但显然整个查询被假定为 PL/SQL 格式,因此查询的 2) 部分没有按预期制定。另外,我已经尝试eval'ing 仅查询的set_date 部分,这似乎工作正常,所以唯一的问题是正确执行 2) SQL 查询。
是否可以使用相同的 sqoop 连接调用第二个查询? 是否可以使用 sqoop 将 1) 和 2) 语句混合为一个以获得相同的结果(现在一个简单的选择表就足够了)?
注意:我没有太多使用 SQL 和 PL/SQL 的经验,如果我没有足够清楚地指定某些部分,非常抱歉。
【问题讨论】:
-
我不知道 sqoop,但是如果您使用的是 Oracle 12.1,您可以尝试将这两个语句组合成一个匿名块并返回一个隐式结果集,类似于 stackoverflow.com/a/43451151/230471跨度>