Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件

首先说一下,这里解决的问题应用场景:

sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区?

这里涉及到两种情况:select SQL查询和加载Hive表路径的方式。这里仅就"加载Hive表路径的方式"解析分区表字段,在处理时出现的一些问题及解决作出详细说明。

如果大家有类似的需求,笔者建议通过解析Spark SQL logical plan和下面说的这种方式解决方案结合,封装成一个通用的工具。

问题现象

sparksql加载指定Hive分区表路径,生成的DataSet没有分区字段。如:

sparkSession.read.format("parquet").load(s"${hive_path}"),hive_path为Hive分区表在HDFS上的存储路径。

hive_path的几种指定方式会导致这种情况的发生(test_partition是一个Hive外部分区表,dt是它的分区字段,分区数据有dt为20200101和20200102):

1.hive_path为"/spark/dw/test.db/test_partition/dt=20200101"

2.hive_path为"/spark/dw/test.db/test_partition/*"

因为牵涉到的源码比较多,这里仅以示例的程序中涉及到的源码中的class、object和方法,绘制成xmind图如下,想细心研究的可以参考该图到spark源码中进行分析。

问题分析

我这里主要给出几个源码段,结合上述xmind图理解:

在没有指定参数basePath的情况下:

1.hive_path为/spark/dw/test.db/test_partition/dt=20200101

bash 复制代码
sparksql底层处理后得到的basePaths: Set(new Path("/spark/dw/test.db/test_partition/dt=20200101"))【伪代码】

leafDirs: Seq(new Path("/spark/dw/test.db/test_partition/dt=20200101"))【伪代码】

2.hive_path为/spark/dw/test.db/test_partition/*

bash 复制代码
sparksql底层处理后得到的basePaths: Set(new Path("/spark/dw/test.db/test_partition/dt=20200101"),new Path("/spark/dw/test.db/test_partition/dt=20200102"))【伪代码】

leafDirs: Seq(new Path("/spark/dw/test.db/test_partition/dt=20200101"),new Path("/spark/dw/test.db/test_partition/dt=20200102"))【伪代码】

这两种情况导致源码if(basePaths.contains(currentPath))为true,还没有解析分区就重置变量finished为true跳出循环,因此最终生成的结果也就没有分区字段:

解决方案(亲测有效)

1.在Spark SQL加载Hive表数据路径时,指定参数basePath,如

sparkSession.read.option("basePath","/spark/dw/test.db/test_partition")

2.主要重写basePaths方法和parsePartition方法中的处理逻辑,同时需要修改其他涉及的代码。由于涉及需要改写的代码比较多,可以封装成工具。
更多干货抢先看大数据技术干货汇总 ------ 助力迎接复杂多变且充满机遇的2025

相关推荐
落日漫游2 小时前
MySQL常用命令全攻略
数据库·sql·oracle
ptc学习者14 小时前
oracle logwr,ckpt,dbwn 如何协同工作的
数据库·sql
计算机毕设残哥16 小时前
基于Hadoop+Spark的商店购物趋势分析与可视化系统技术实现
大数据·hadoop·python·scrapy·spark·django·dash
IT研究室16 小时前
大数据毕业设计选题推荐-基于大数据的全球能源消耗量数据分析与可视化系统-大数据-Spark-Hadoop-Bigdata
大数据·hadoop·spark·毕业设计·源码·数据可视化·bigdata
Lansonli19 小时前
大数据Spark(六十五):Transformation转换算子groupByKey和filter
大数据·分布式·spark
lifallen21 小时前
Flink SQL 查询 核心概念与实战指南
大数据·数据库·sql·flink
还是奇怪1 天前
SQL注入的“无影脚”:详解空格绕过WAF的N种方法
数据库·sql·安全·web安全
xcg3401231 天前
Spring boot中 限制 Mybatis SQL日志的大字段输出
spring boot·sql·mybatis·大字段打印
Thomas21431 天前
spark pipeline 转换n个字段,如何对某个字段反向转换
大数据·ajax·spark
孟意昶2 天前
Spark专题-第三部分:性能监控与实战优化(1)-认识spark ui
大数据·数据仓库·sql·ui·spark·etl