You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark如何通过通配符仅加载昨日和今日的指定XML文件?

问题:Spark加载昨日和今日XML文件的通配符写法错误

文件列表

file_20231603_134035_000000.xml,
file_20231603_073340_000003.xml,
file_20231503_073340_000009.xml,
file_20231503_073340_000015.xml,
file_20231503_073340_000021.xml,
file_20231503_072807_000000.xml,
file_20231403_073340_000004.xml,
file_20231303_073340_000010.xml,
file_20231303_073340_000016.xml,
file_20231403_073340_000022.xml

尝试的代码

val dafo = new SimpleDateFormat("yyyyMMdd")
val calendar = Calendar.getInstance()
calendar.add(Calendar.DATE, 0)
val currentDate = dafo.format(calendar.getTime)
calendar.add(Calendar.DATE, -1)
val previousDate = dafo.format(calendar.getTime)

sparkSession.read
          .format("xml")
          .option("rootTag", "foo")
          .option("rowTag", "bar")
          .load(s"file_(${previousDate}|${currentDate})*.xml")

问题分析

你使用的file_(${previousDate}|${currentDate})*.xml写法无效,因为Spark的load方法支持的是glob通配符模式,而非正则表达式语法。glob模式不支持()和|这类正则符号,需要改用glob兼容的写法。

正确写法

推荐两种可行方案:

方案1:逗号分隔多个匹配模式

直接将昨日、今日的文件匹配模式用逗号分隔,Spark会自动匹配符合任意一个模式的文件,这种方式直观且通用性强:

sparkSession.read
          .format("xml")
          .option("rootTag", "foo")
          .option("rowTag", "bar")
          .load(s"file_${previousDate}*.xml,file_${currentDate}*.xml")

方案2:glob方括号匹配(仅适用于特定场景)

如果日期前缀存在连续字符规律,也可以用glob的方括号语法匹配,但灵活性较差,仅适合固定格式的日期场景:

// 示例:假设previousDate为20231503,currentDate为20231603
sparkSession.read
          .format("xml")
          .option("rootTag", "foo")
          .option("rowTag", "bar")
          .load(s"file_20231[56]03*.xml")

补充说明

Spark文件路径匹配遵循Hadoop glob规则,常用语法包括:

  • *:匹配任意数量的非路径分隔符字符
  • ?:匹配单个任意字符
  • [abc]:匹配a、b、c中的任意一个字符
  • {path1,path2}:匹配path1或path2指定的路径

内容的提问来源于stack exchange,提问作者jOasis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:52:45