Apache spark Spark 2.4.6+;JDBC阅读器:当谓词下推设置为false时,数据是否由spark从引擎并行读取?

Apache spark Spark 2.4.6+;JDBC阅读器:当谓词下推设置为false时,数据是否由spark从引擎并行读取?,apache-spark,jdbc,hana,Apache Spark,Jdbc,Hana,我试图从SAP HANA中的一个大表中提取数据,该表的大小约为1.5tb,最好的方法是跨节点和线程并行运行。Spark JDBC是该任务的最佳候选,但为了实际并行提取,需要设置分区列、下限/上限和分区数选项。为了简化提取操作,我考虑添加一个分区列,它将是row_number()函数,并分别使用MIN()、MAX()作为上下限。然后,操作团队只需要提供分区的数量 问题是HANA内存不足,很可能是row_number()在引擎上成本过高。我只能想象,100多个线程在每次获取期间运行相同的查询,以应用

我试图从SAP HANA中的一个大表中提取数据,该表的大小约为1.5tb,最好的方法是跨节点和线程并行运行。Spark JDBC是该任务的最佳候选,但为了实际并行提取,需要设置分区列、下限/上限和分区数选项。为了简化提取操作,我考虑添加一个分区列,它将是row_number()函数,并分别使用MIN()、MAX()作为上下限。然后,操作团队只需要提供分区的数量

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

所以我的问题是,如果禁用谓词下推选项,spark的行为如何?是否只有一个执行器读取,然后在火花侧应用过滤器?或者从数据库中分离提取部分是否有魔力

对于使用可用的JDBC读取器提取如此大的表,您有什么建议


提前感谢。

在从Spark执行主查询之前,请运行预摄取查询以获取正在加载的数据集的大小,如您所述的Min()、Max()等

希望数据在最小和最大密钥之间均匀分布,您可以通过提供最小/最大/执行器数在Spark中跨执行器进行分区


在这种情况下,您不需要(希望)通过添加额外的列来更改主数据源以支持数据摄取。

添加新的计算列(如row_num)的想法是为700多个表确定合适的分区列,离开操作团队,只需要他们说我希望这个表同时有这个数量的连接到HANA。只要您有更改分区数量的灵活性,现在可以是10个分区,将来可以是20个。或者,不同的用例可能需要不同的分区