我使用pyspark从oracledb表中读取数据。我的做法是:
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没有控制的能力?
谢谢
2条答案
按热度按时间8aqjt8rx1#
甲骨文寻找
ID
子查询中的列。这很可能就是错误所在。我不熟悉spark,但我们可以尝试添加
profiles
在子查询中,如下所示:只要改变
pk_name
用你的主键profiles
table。xzlaal3s2#
我不确定如何从pyspark修改这个查询,但是有几种方法可以从数据库方面修改查询。例如,包
DBMS_ADVANCED_REWRITE
用于将一个查询交换为另一个查询。这个包可能很难使用,因为您必须获得查询的确切文本。如果文字改变了,你需要单独的重写,所以希望你能控制这些数字。最后的查询必须与提示不同,这就是我添加提示的原因
1=1
. 您可能还需要包的特权,并且可能需要dba来运行此命令:grant execute on dbms_advanced_rewrite to your_username;
如果上面的代码不起作用,还可以通过sql概要文件、sql转换框架或引用外部查询块名称的提示强制查询更改提示。