Sqoop 在似乎存在且具有正确权限的 table 上抛出 "table or view does not exist"
Sqoop throwing "table or view does not exist" on table that appears to exist and have correct permissions
使用 sqoop v1 通过 free-form query 在 Oracle 数据库中导入视图
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
使用的“AND (1 = 0)”。从此处评论和其他地方的讨论来看,sqoop 语句中创建的 0=1 旨在由 sqoop 获取 table(在本例中为视图)列。
查看同一架构中违规视图与成功视图的详细信息,它们似乎具有相同的同义词
和资助
让我怀疑这是权限问题。
有谁知道这里会发生什么以及为什么?任何调试建议或修复?
*更新:
在 sqoop 显然需要访问 oracle tables 的一些权限上查看 oracle 数据库。查看一些似乎相关的 articles 并尝试检查工作视图与非工作视图的赠款,我看到...
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: table or view does not exist
这很奇怪,因为 sqoop 对另一个视图没有问题。
将尝试打开数据库的日志记录并查看是否可以获得有关 sqoop 正在发送导致问题的确切查询的更多信息。
问题是我给 sqoop 命令的视图名称是视图的“真实”名称,当视图被赋予不同 synonym 在 Oracle 数据库中。没有 Oracle DBA 经验,所以没想到要找这个,但是...
Description
A synonym is an alternative name for objects such as tables, views, sequences, stored procedures, and other database objects.
You generally use synonyms when you are granting access to an object from another schema and you don't want the users to have to worry about knowing which schema owns the object.
我猜问题在于(尽管我可以在连接到远程数据库的查询编辑器中通过其“真实”名称引用视图)无论出于何种原因,sqoop 因未使用视图的别名/同义词。
成功使用视图的同义词而不是“真实”名称运行。
* 虽然我确实包含了视图同义词图像的片段,但我省略了实际的同义词名称(不知道它的重要性)并且也没有使用视图的实际名称(而是使用占位符名称)。这样做是因为出于隐私原因,使用实际的 table 名称是不合适的。 (所以有点搬起石头砸自己的脚,从别人那里得到一个好的答案)。
使用 sqoop v1 通过 free-form query 在 Oracle 数据库中导入视图
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
使用的“AND (1 = 0)”。从此处评论和其他地方的讨论来看,sqoop 语句中创建的 0=1 旨在由 sqoop 获取 table(在本例中为视图)列。
查看同一架构中违规视图与成功视图的详细信息,它们似乎具有相同的同义词
和资助
让我怀疑这是权限问题。
有谁知道这里会发生什么以及为什么?任何调试建议或修复?
*更新:
在 sqoop 显然需要访问 oracle tables 的一些权限上查看 oracle 数据库。查看一些似乎相关的 articles 并尝试检查工作视图与非工作视图的赠款,我看到...
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: table or view does not exist
这很奇怪,因为 sqoop 对另一个视图没有问题。
将尝试打开数据库的日志记录并查看是否可以获得有关 sqoop 正在发送导致问题的确切查询的更多信息。
问题是我给 sqoop 命令的视图名称是视图的“真实”名称,当视图被赋予不同 synonym 在 Oracle 数据库中。没有 Oracle DBA 经验,所以没想到要找这个,但是...
Description
A synonym is an alternative name for objects such as tables, views, sequences, stored procedures, and other database objects.
You generally use synonyms when you are granting access to an object from another schema and you don't want the users to have to worry about knowing which schema owns the object.
我猜问题在于(尽管我可以在连接到远程数据库的查询编辑器中通过其“真实”名称引用视图)无论出于何种原因,sqoop 因未使用视图的别名/同义词。
成功使用视图的同义词而不是“真实”名称运行。
* 虽然我确实包含了视图同义词图像的片段,但我省略了实际的同义词名称(不知道它的重要性)并且也没有使用视图的实际名称(而是使用占位符名称)。这样做是因为出于隐私原因,使用实际的 table 名称是不合适的。 (所以有点搬起石头砸自己的脚,从别人那里得到一个好的答案)。