Spark升级至3.2后Superset SQL Labs查询Trino表值错位问题
问题:Spark 3.2生成Parquet表在Trino查询时数据错位
在Spark中将Parquet文件保存为表后,复制为Trino中的Hive表(同Parquet格式),使用Superset SQL Labs查询时出现部分行的值错位问题:直接查询Spark表结果正常,但SQL Labs返回的结果里部分行的有效值位置错误。该问题在Spark从3.1升级到3.2后出现,执行spark.catalog.clearCache()清除缓存后无改善。
数据示例
Spark表查询结果
+----------+----------+----------+ | Column 1 | Column 2 | Correct? | +----------+----------+----------+ | ABC | ABC | Yes | | DEF | DEF | Yes | | GHI | GHI | Yes | | JKL | JKL | Yes | +----------+----------+----------+
Superset SQL Labs查询结果
+----------+----------+----------+ | Column 1 | Column 2 | Correct? | +----------+----------+----------+ | ABC | GHI | No | | DEF | DEF | Yes | | GHI | ABC | No | | JKL | JKL | Yes | +----------+----------+----------+
版本信息
- Spark 3.2
- Trino 363(集成在Superset中)
- PySpark 3.2.1
- Superset 1.3.1
可能的解决方案
- 检查Parquet写入兼容配置:Spark 3.2将
spark.sql.parquet.writeLegacyFormat默认值从true改为false,导致生成的Parquet格式与旧版读取逻辑不兼容。尝试设置该参数为true后重新写入表:spark.conf.set("spark.sql.parquet.writeLegacyFormat", "true") # 重新执行表写入逻辑 - 刷新Hive元数据:Spark写入表后,执行
MSCK REPAIR TABLE <table_name>刷新Hive元数据,确保Trino读取的表结构与Spark表完全一致,包括列名、数据类型、分区信息。 - 调整Trino Parquet读取配置:在Trino中启用
parquet.legacy-reader参数,强制使用兼容模式读取Spark 3.2生成的Parquet文件。 - 排查分区与排序逻辑:若为分区表,检查分区键是否配置正确;同时验证Spark写入时的排序规则,避免因Spark 3.2排序逻辑变更导致数据存储顺序混乱,引发Trino读取错位。
内容的提问来源于stack exchange,提问作者pouchpenguin
相关产品推荐
相关产品推荐

