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
我想检查 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