我有一个包含4000万个标签的表。我在以下视图中运行Java上的Spark SQL查询。我使用磁盘缓存,查询仍然比简单的postgres查询慢。如果有人遇到这样的问题,请纠正我的错误。
SparkSession ss = SparkSession
.builder()
.master("local")
.appName("Sql spark session")
.getOrCreate();
Dataset<Row> dsRow = ss.read().format("jdbc").option("driver", "org.postgresql.Driver")
.option("url", "jdbc:postgresql://localhost:5433/db_name")
.option("dbtable", "tb_name")
.option("user", "postgres")
.option("password", "456")
.load();
dsRow.createOrReplaceTempView("people");
dsRow.persist(StorageLevel.DISK_ONLY());
Dataset<Row> dsRowSql = ss.sql("select * from people where firstname like 'fi%s%n%m%' and surname like 's%rn%me'");
dsRowSql.show();
几点观察:
-
我不知道你是如何衡量你的时间的,但是如果你在Spark中复制所有的数据,然后查询,它将比在PostgreSQL中查询数据要慢。测量一下时间都花在什么地方会很有趣。
-
你可以将ingestion SELECT语句推送到PostgreSQL,这样你就不必将所有的数据复制到Spark,看看:https://github.com/jgperrin/net.jgp.books.spark.ch08/blob/master/src/main/java/net/jgp/books/spark/ch08/lab300_advanced_queries/MySQLWithWhereClauseToDatasetApp.java.
-
如果你想尝试缓存和检查点,这是提高性能的方法,看看https://github.com/jgperrin/net.jgp.books.spark.ch16,它应该给你一个很好的框架来评估优化。
-
我不确定你是否需要调整持久化到磁盘,它可能会减慢这里的事情:
dsRow.persist (StorageLevel.DISK_ONLY ());