如何使用Spark SQL关联临时表并读取多月份目录数据
两种方案均可实现需求,优先推荐直接创建单张临时表的方案,实现更简洁、性能更好。
方案1:分别创建单月临时表后合并查询
不需要强制使用该方案,但如果你已经创建好了2月的临时表,补建3月临时表后通过UNION ALL合并结果即可。注意同结构的多月份数据是纵向合并,不要用JOIN(JOIN用于横向关联不同结构的表)。
示例代码:
# 补建3月数据临时表 df_mar = spark.read.json("wasbs://container@storage.blob.core.windows.net/topics/details/year=2022/month=03/") df_mar.createOrReplaceTempView("tableForMar2022")
查询时直接合并两表数据:
-- 合并两个月数据查询,可按需添加过滤、聚合逻辑 SELECT * FROM tableForFeb2022 UNION ALL SELECT * FROM tableForMar2022
注意:如果两个表的字段顺序、类型不完全一致,SELECT时要显式指定对齐的字段名,不要直接用SELECT *,避免字段错位。
方案2:直接创建覆盖两个月数据的单个临时表(推荐)
Spark原生支持该能力,读取文件时支持传入多路径列表、分区通配符两种方式一次性读取多个目录的数据,一次建表即可查询全量数据,省去后续合并的步骤。
两种实现写法:
写法1:传入精准路径列表
适合明确指定少量目录的场景,不会误读其他无关目录:
# 传入路径列表,一次性读取2月、3月数据 df_bimonth = spark.read.json([ "wasbs://container@storage.blob.core.windows.net/topics/details/year=2022/month=02/", "wasbs://container@storage.blob.core.windows.net/topics/details/year=2022/month=03/" ]) df_bimonth.createOrReplaceTempView("tableFor202202_03")
写法2:分区通配符匹配
适合批量读取多个连续/不连续分区的场景,后续扩展读更多月份只需要改通配符规则即可:
# 大括号内枚举需要匹配的month分区值,自动匹配对应目录 df_bimonth = spark.read.json("wasbs://container@storage.blob.core.windows.net/topics/details/year=2022/month={02,03}/") df_bimonth.createOrReplaceTempView("tableFor202202_03")
由于你的存储路径是标准的year=xx/month=xx分区格式,Spark读取时会自动识别分区字段,后续查询时加WHERE month = '02'这类过滤条件会自动做分区裁剪,不会扫描无关数据,查询性能和读取单月表没有差异。
内容的提问来源于stack exchange,提问作者ZZZSharePoint
相关产品推荐
相关产品推荐

