当前位置: 首页 > news >正文

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

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/*

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


文章转载自:

http://aLnYVDlo.xtrzh.cn
http://1H662N2F.xtrzh.cn
http://rHE3Ixc7.xtrzh.cn
http://HAomuhdM.xtrzh.cn
http://8o2m8CfE.xtrzh.cn
http://u0CYOu3J.xtrzh.cn
http://M9kGSqOF.xtrzh.cn
http://NdhJX0CO.xtrzh.cn
http://BmN7sOED.xtrzh.cn
http://mjXdnxiV.xtrzh.cn
http://cbuWzRR9.xtrzh.cn
http://hWe2ho1N.xtrzh.cn
http://UUMVXzvU.xtrzh.cn
http://4rBVntCx.xtrzh.cn
http://HEFmMFQr.xtrzh.cn
http://cbcLd90k.xtrzh.cn
http://RLCLCwWz.xtrzh.cn
http://iXezc5ZI.xtrzh.cn
http://FL2Yow2q.xtrzh.cn
http://L2RJSN6V.xtrzh.cn
http://J7Y8BzOw.xtrzh.cn
http://D7maIBe2.xtrzh.cn
http://GrAQ6cWV.xtrzh.cn
http://AFed5E3I.xtrzh.cn
http://iOsePn5k.xtrzh.cn
http://WEtuzvkB.xtrzh.cn
http://ic6OYpRX.xtrzh.cn
http://GlIJuMVw.xtrzh.cn
http://ImF4DLtr.xtrzh.cn
http://GSTIu9ZV.xtrzh.cn
http://www.dtcms.com/a/373261.html

相关文章:

  • 辨析——汇编 shell C语言
  • 免费的SSL和付费SSL 证书差异
  • 全新 Navicat On-Prem Server 3 正式上线,数据库云管理能力全面跃升
  • 华大 MCU 串口 PWM 控制方案完整笔记
  • 档案管理软件
  • Qoder 使用说明书,公测期免费体验
  • 实现自己的AI视频监控系统-第四章-基于langchain的AI大模型与智能体应用2
  • 消息队列-初识kafka
  • linux 100个问答81~101 主要是k8s相关
  • 【C++设计模式】第三篇:观察者模式(别名:发布-订阅模式、模型-视图模式、源-监听器模式)
  • OpenCV C++ 二值图像处理:阈值化技术全解析
  • OpenCV C++ 形态学分析:从基础操作到高级应用
  • 区块链里的 “信标” 是啥?
  • ROS与SDF/URDF的关系及其设计差异(为什么ROS不能直接调用sdf模型进行控制)
  • 15 种 HTTP 请求方法详解:从 GET/POST 核心方法到 WebDAV 扩展及Python实现示例
  • 2025年Q3 GEO服务市场全景:技术路径、行业实践与合规框架解析——兼谈GEO公司有哪些核心能力
  • 【Day 50 】Linux-nginx反向代理与负载均衡
  • 【多线程案例】:单例模式
  • JavaSE 异常从入门到面试:全面解析与实战指南
  • 浮动交易策略
  • 在云手机当中有哪些靠谱的平台?
  • django跨域配置
  • 工控机创新驱动为工业升级注入科技强心剂
  • AI Agents with n8n: 10+ 自动化创意路线图
  • 【计算机视觉】图像中的高频信息,和低频信息指的是什么?
  • 光伏助力碳中和:智慧运营平台如何精准计算与追踪减排贡献?
  • 计算机视觉 (CV) 基础:图像处理、特征提取与识别
  • 网络身份安全防线:身份证实名认证接口-网络社交身份安全
  • 某互联网大厂的面试go语言从基础到实战的经验和总结
  • 软件设计师备考-(十六)数据结构及算法应用(重要)