Pyspark:如何检查 s3 中是否存在具有通配符的文件路径

Pyspark: How to check whether a file path with wild character exists in s3

我想检查 s3 路径中是否存在文件,然后将其作为 spark 数据帧读取。问题是我不知道文件的确切路径,所以我必须使用通配符。例如,我的路径看起来像这样:

path = 's3a://dir1/dir2/someHashString-2021-09-29-14-52-randomStuff.gz'

我不知道'someHashString''randomStuff'是什么,所以,我可能不得不使用这样的通配符

path = 's3a://dir1/dir2/*-2021-09-29-14-52-*' 

我正在尝试 提到的第一个解决方案,如下所示:

def path_exists(path):
    # spark is a SparkSession
    sc = spark.sparkContext
    fs = sc._jvm.org.apache.hadoop.fs.FileSystem.get(
         sc._jvm.java.net.URI.create("s3a://" + path.split("/")[2]),
         sc._jsc.hadoopConfiguration(),
                                                     )
    return fs.exists(sc._jvm.org.apache.hadoop.fs.Path(path))

path_exists(path='s3a://dir1/dir2/*-2021-09-29-14-52-*')

但是 returns False 甚至这样的路径确实存在。如何检查此文件路径是否存在?

文件系统方法exists不支持文件路径中的通配符来检查是否存在。

您可以改用 globStatus,它支持特殊模式匹配字符,例如 *。如果它 returns 是一个非空列表,则该文件存在,否则它不存在:

def path_exists(path):
    hpath = sc._jvm.org.apache.hadoop.fs.Path(path)
    fs = hpath.getFileSystem(sc._jsc.hadoopConfiguration())

    return len(fs.globStatus(hpath)) > 0


print(path_exists("s3a://dir1/dir2/*-2021-09-29-14-52-*"))
# True