使用spark查询mysql的my_table表中,status字段的值为"active"的数据
第一次查询:
val mysqlDF: DataFrame = spark
.read
.format("jdbc")
.options(loadMysqlConfig("my_table"))
.load()
mysqlDF.where(col("status").isInCollection(Seq("Active"))).show()
结果:可以查询到表中的数据
分析:where条件的过滤计算,会下推到mysql sql中。
由于表的字符集配置为CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci,匹配时忽略了大小写,所以即使mysql中数据值为“active”,也可以匹配到数据。
第二次查询:多了一行 “mysqlDF.persist()”
val mysqlDF: DataFrame = spark
.read
.format("jdbc")
.options(loadMysqlConfig("my_table"))
.load()
mysqlDF.persist()
mysqlDF.where(col("status").isInCollection(Seq("Active"))).show()
结果:无法查询到数据
分析:只是多了一行mysqlDF.persist(),逻辑就变为spark先把整表数据load出来,再使用spark sql的where过滤计算。由于spark sql匹配字符串时,默认是区分大小写的,所以无法匹配到数据。