spark 读取 jdbc 的时候 where 过滤的问题

一般来说,我们使用这样的方式让 spark 去读取 jdbc

DataFrame dataFrame = sqlContext.read().jdbc(jdbcUrl, tableName, DBConfigUtil.generateProperties());

随之而来一个问题是,这样是读取整张表的,如果我们要读取某一部分的数据呢?

自然的想法是 sqlContext 的 read 接口应该有参数可以控制,可惜没有,走读 spark 代码,看到这里,https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/jdbc/JDBCRelation.scala#L103,和这里,https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/jdbc/JDBCRDD.scala#L195,跟着到了这里,https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/Dataset.scala#L1141,可以发现其实有一个 filter

随之而来的一个疑问是,这个 filter 的动作,是发生在 fetch data 之前还是之后呢

通过这里,http://stackoverflow.com/questions/6479107/how-to-enable-mysql-query-log,打开 query log,可以看到是在 fetch data 之前,作为 query sql 的一部分发送到 db server 的

这个例子也再次印证了 spark 的 lazy load

Leave a Reply

Your email address will not be published. Required fields are marked *