Spark 2.4.6 + JDBC Reader:当谓词下推设置为false时,引擎是否通过Spark并行读取数据?

问题描述

我正在尝试从SAP HANA的一个大表中提取数据,该表的大小约为1.5tb,最好的方法是在节点和线程之间并行运行。 Spark JDBC是完成此任务的理想选择,但要并行提取实际上需要将“分区列”,“上下限”和“分区数”选项设置。为了简化提取操作,我考虑添加一个添加的分区列,该分区列将是row_number()函数,并分别使用MIN()和MAX()作为下/上限。然后只需要操作团队提供要拥有的分区数量即可。

问题在于HANA内存不足,很可能row_number()在引擎上的成本太高。我只能想象,在每次抓取中,有100个以上的线程运行相同的查询,以应用where过滤器并检索相应的块。

所以我的问题是,如果我禁用谓词下推选项,spark的行为如何?它仅由一名执行者读取,然后将过滤器应用于火花侧吗?还是将魔术师从数据库中分离出抓取部分发挥了魔力?

使用可用的JDBC阅读器提取这么大的表有什么建议?

谢谢。

解决方法

在从Spark执行主查询之前,请运行pre-ingestion查询以获取要加载的数据集的大小,即您提到的Min(),Max()等。

考虑到数据在最小键和最大键之间均匀分布,您可以通过提供执行器的最小/最大/数量来在Spark中对执行器进行分区。

在这种情况下,您不需要(想要)通过添加其他列来支持数据提取来更改主数据源。