spark 读取到的mysql数据不一致的原因分析

使用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匹配字符串时,默认是区分大小写的,所以无法匹配到数据。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容