python—是否可以修改apachesparkjdbc连接器的查询?

ttp71kqs  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(347)

我使用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没有控制的能力?
谢谢

8aqjt8rx

8aqjt8rx1#

甲骨文寻找 ID 子查询中的列。这很可能就是错误所在。
我不熟悉spark,但我们可以尝试添加 profiles 在子查询中,如下所示:

select /*+ FULL(profiles) SCN_ASCENDING */ data, sys_hashval, pk_name "ID"
from profiles

只要改变 pk_name 用你的主键 profiles table。

xzlaal3s

xzlaal3s2#

我不确定如何从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, data, 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概要文件、sql转换框架或引用外部查询块名称的提示强制查询更改提示。

相关问题