a)与传统的java JDBC调用相比,Spark是否可以优化从关系数据库中获取数据的方法?b)如何在运行Spark查询时减少数据库的负载,因为我们将为所有查询直接访问生产数据库。为Spark报表案例,假设生产中有3000万个订单记录和1.5亿个订单线记录。
a)
-
你当然可以在你的Spark应用程序中使用。cache()来避免在你的Spark应用程序的生命周期内对该数据帧重复执行JDBC
-
您可以通过使用partitionColumn, lowerBound, upperBound和numPartitions属性通过范围分区并行JDBC调用读取数据帧。这对于分布式(分区)数据库后端是有意义的。
-
您可以使用集成的Spark集群与分布式数据库引擎(如IBM dashDB),它运行与数据库分区共存的Spark执行器,并在Spark和数据库之间执行本地IPC数据交换机制:https://ibmdatawarehousing.wordpress.com/category/theme-ibm-data-warehouse/
b)如果适用的话,上面提到的spark端缓存可以提供帮助。此外,Spark中的JDBC数据源确实尝试将预测和过滤从Spark SQL/数据框架操作中预测到底层SQL数据库。检查结果命中数据库的sql。