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
相关产品推荐
相关产品推荐

