我试图通过阅读MySQL日志来了解Spark如何从MySQL加载数据。但是我发现Spark不会在使用filter()方法生成的SQL查询中添加日期过滤器。
这是我在Spark中加载数据的方式:
Properties configProps = new Properties();
// ... properties init
SparkSession spark = SparkSession.builder().enableHiveSupport().getOrCreate();
spark.read().jdbc("jdbc:mysql://localhost/testdb", "table", configProps)
.filter("user_id = 1 and date >= \"2019-02-01 00:00:00.000\" and date <= \"2019-02-01 23:59:59.999\"")
.write().saveAsTable("test_table");
我发现它的MySQL日志如下:
SELECT * FROM table WHERE user_id = 1
该日期未添加到WHERE子句中。为什么会这样呢? Spark是否正在尝试从表中加载所有日期的数据?我的表中将有数百万条记录,但每次只需要数千条。
我也尝试用where()替换filter(),但是没有运气。
有什么方法可以强制Spark使用我在filter()方法中指定的所有条件?
PS:在Spark的网站上没有发现任何描述Spark内部工作方式的信息。有没有推荐的书籍和网站?谢谢!