如何解决是否可以修改Apache Spark JDBC连接器的查询?
我正在使用PySpark从Oracle DB表读取数据。 我这样做的方式是:
profiles = spark.read.jdbc(
url=db_url,table='(select /*+ SCN_ASCENDING */ '
'data,sys_hashval from profiles)',properties=connection_details,predicates=predicates_list)
Spark将此翻译为以下形式的查询:
SELECT "ID","DATA"
FROM (
select /*+ FULL(profiles) SCN_ASCENDING */ id,data,sys_hashval
from profiles
)
WHERE sys_hashval >= 10840662 and sys_hashval < 11012736
这是引起问题的原因,因为我添加到内部子查询的提示不在Spark添加的外部查询中。 反正有修改外部查询吗?还是Spark不能控制它?
谢谢
解决方法
我不确定如何从PySpark修改此查询,但是有几种方法可以从数据库端修改查询。例如,包DBMS_ADVANCED_REWRITE
可让您将一个查询换成另一个查询。
begin
sys.dbms_advanced_rewrite.declare_rewrite_equivalence
(
name => 'spark_rewrite_1',source_stmt => q'[SELECT "ID","DATA"
FROM (
select /*+ FULL(profiles) SCN_ASCENDING */ id,data,sys_hashval
from profiles
)
WHERE sys_hashval >= 10840662 and sys_hashval < 11012736]',destination_stmt => q'[SELECT /*+ SCN_ASCENDING */ "ID","DATA"
FROM (
select /*+ FULL(profiles) */ id,sys_hashval
from profiles
)
WHERE sys_hashval >= 10840662 and sys_hashval < 11012736 and 1=1]',validate => false,rewrite_mode => 'TEXT_MATCH'
);
end;
/
该软件包可能难以使用,因为您必须获取查询的确切文本。如果文字变化,则需要单独重写,因此希望您可以控制这些数字。而且最终查询必须与提示不同,这就是为什么我添加了1=1
。您可能还需要该软件包的特权,并且可能需要DBA来运行以下命令:grant execute on dbms_advanced_rewrite to your_username;
如果上述代码不起作用,则也可以通过SQL Profile,SQL转换框架或可能是引用外部查询查询块名称的提示来强制查询更改提示。
, Oracle在子查询中寻找ID
列。这很可能是错误。
我不熟悉Spark,但是我们可以尝试在子查询中添加profiles
的主键,如下所示:
select /*+ FULL(profiles) SCN_ASCENDING */ data,sys_hashval,pk_name "ID"
from profiles
只需使用pk_name
表的主键更改profiles
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。