在计算机编程中,glob 模式用通配符指定文件名集。
我正在使用pyspark,我想用一种表达方式来读取文件名集合。假设目录/dir1/dir2/下有2020年和2021年全部的数据,每天的数据放在该天目录下,即2021年7月1日的数据放在20210701目录下,如果我想读取2021年全部的文件,只需以下代码
spark.read.load("/dir1/dir2/2021*")
但如果我只想读取2月份和3月份的所有数据呢?
开始我的思路是用正则表达式表示,但python中我对正则表达式一窍不通,然后我去学了python的正则表达式相关知识,学的时候我知道应该不是这么回事,解决不了我的问题,但正则表达式挺有趣的,所以我学完了嘿嘿嘿,然后写了篇python正则表达式入门_Jimmy and Zoey-CSDN博客。
言归正传,我还是不知道如何读取我想指定的文件名集。然后查阅资料,我发现了glob!!!这才是我想要的。wiki中对glob介绍的第一句为“在计算机编程中,glob 模式用通配符指定文件名集”。
常用语法包括:
- * 匹配任意长度的字符,包括空字符
- ? 匹配任意一个字符
- [abc]匹配任意一个方括号里的字符
- [a-z]匹配任意一个小写字母
所以解答上面的问题,如果我只想读取2月份和3月份的所有数据,只需写
spark.read.load("/dir1/dir2/20210[23]*")
在类unix系统中,[…]还有两种额外语法
- [!abc]匹配任意一个不在方括号中的字符
- [!a-z]匹配任意一个不是小写字母的字符
这个在pyspark中亲测可行。毕竟确实是运行在linux上的。
在sql中,glob语法中的?和*都有等价的匹配,如?在sql中是_,*在sql中是%。但[…]却没有没有等价的匹配。SQL 的许多实现都扩展了 LIKE 运算符以允许更丰富的模式匹配语言,包括字符范围 ([…])、它们的否定和正则表达式的元素。
最后再抛出一个问题,如果我要读取1-11月份的所有数据呢?????