使用sqoopv1在oracledb中通过自由形式查询导入视图
sqoop import \
-Dmapreduce.map.memory.mb=3144 -Dmapreduce.map.java.opts=-Xmx1048m \
-Dyarn.app.mapreduce.am.log.level=DEBUG \
-Dmapreduce.map.log.level=DEBUG \
-Dmapreduce.reduce.log.level=DEBUG \
-Dmapred.job.name="Ora import table $tablename" \
-Djava.security.egd=file:///dev/urandom \
-Djava.security.egd=file:///dev/urandom \
-Doraoop.timestamp.string=false \
-Dmapreduce.map.max.attempts=10 \
$oraclefile \
--as-parquetfile \
--target-dir $importdir \
-query "select a.*, current_date as etl_date from $tablename a where 1=1 AND \$CONDITIONS" \
--split-by $splitby \
--where "1=1" \
--num-mappers 12 \
--delete-target-dir
然后出错
19/08/12 14:45:50 ERROR manager.SqlManager: Error executing statement: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
再检查一下输出,我看到了输出
19/08/12 14:45:50 INFO manager.SqlManager: Executing SQL statement: select a.*, current_date as etl_date from MY_VIEW a where 1=1 AND (1 = 0)
注意sqoop用于 $CONDITIONS
. 根据here注解和其他地方的讨论,在sqoop语句中创建的0=1是为了让sqoop获取表(在本例中是view)列。
在同一个模式中查看违规视图和成功视图的详细信息,它们似乎具有相同的同义词
和补助金
让我怀疑这是权限问题。
有人知道这里会发生什么,为什么吗?有什么调试建议或修正吗?
- 更新:
查看oracledb中sqoop访问oracle表显然需要的一些权限。看看一些似乎相关的文章,并试图检查一个工作的观点与非工作的一个赠款,我看到。。。
SELECT * FROM USER_SYS_PRIVS;
<was blank (note I am not the DBA and there may be restrictions stopping me from seeing the "true" output)>
select Grantee,'Granted Through Role' as Grant_Type, role, table_name from role_tab_privs rtp, dba_role_privs drp where rtp.role = drp.granted_role and table_name = '<VIEW_THAT_WORKS>' union select Grantee,'Direct Grant' as Grant_type, null as role, table_name from dba_tab_privs where table_name = '<VIEW_THAT_WORKS>' ;
select Grantee,'Granted Through Role' as Grant_Type, role, table_name from role_tab_privs rtp, dba_role_privs drp where rtp.role = drp.granted_role and table_name = '<VIEW_THAT_NOT_WORKS>' union select Grantee,'Direct Grant' as Grant_type, null as role, table_name from dba_tab_privs where table_name = '<VIEW_THAT_NOT_WORKS>' ;
select a.*, current_date as etl_date from <VIEW_THAT_NOT_WORKS> a where (1 = 0)
并且发现在检查授权时,对于工作视图和有问题的视图,我都得到了错误
ora-00942:表或视图不存在
这很奇怪,因为sqoop对另一个视图并没有问题。
将尝试打开数据库的日志记录,并查看是否可以获得有关sqoop发送的导致问题的确切查询的更多信息。
1条答案
按热度按时间42fyovps1#
问题是,我给sqoop命令的视图的名称是视图的“真实”名称,而在oracledb中,视图被赋予了不同的同义词。没有在甲骨文dba的经验,所以真的没有想过要找这个,但是。。。
描述
同义词是对象(如表、视图、序列、存储过程和其他数据库对象)的替代名称。
当您从另一个模式授予对对象的访问权限时,通常使用同义词,并且您不希望用户担心知道哪个模式拥有该对象。
我猜问题是(即使我可以在连接到远程数据库的查询编辑器中通过视图的“真实”名称引用视图)出于任何原因,sqoop因为没有使用视图的别名/同义词而被拒绝。
使用视图的同义词而不是“真实”名称运行成功。