检查 Databricks 笔记本中是否存在 S3 目录

Check for S3 directory existence in Databricks notebook

我在 Databricks 工作,我试图从按序列排序的 S3 实例中获取镶木地板数据,除了序列的某些部分缺失。所以文件系统可能看起来像这样:

 's3a://databricks-data/STAGING/18',
 's3a://databricks-data/STAGING/17',
 's3a://databricks-data/STAGING/16',
 's3a://databricks-data/STAGING/15',
 's3a://databricks-data/STAGING/14',
 's3a://databricks-data/STAGING/13',
 's3a://databricks-data/STAGING/12',
 's3a://databricks-data/STAGING/10',
 's3a://databricks-data/STAGING/09',
 's3a://databricks-data/STAGING/08',
 's3a://databricks-data/STAGING/07'

您会注意到 11 丢失了,这就是问题所在。这些文件夹中偶尔会丢失一些,这不是系统性的或可预测的。因此,来自 Python 的背景,我想我可以从一个序列创建一个文件夹列表,然后测试这样的文件夹是否存在,如果存在,则读取数据,如果不存在,则跳过。像这样:

paths = ["s3a://databricks-data/STAGING/" + str(ii) for ii in range(100)]
paths = [p for p in paths if p.exists()] #**this check -- "p.exists()" -- is what I'm looking for**
df = spark.read.parquet(*paths)

有谁知道如何检查 Databricks 中是否存在 folder/directory?我试过使用 dbutils,但要么我正在使用不同的版本,要么我不知道我在做什么(也许两者都有),因为没有任何效果。我是 Databricks 的新手,所以如果我能澄清这个问题,请告诉我。

你可以用dbutils.fs.ls来实现这样的功能:

def path_accessible(path):
  try:
    dbutils.fs.ls(path)
    return True
  except:
    pass

  return False

然后使用它:

paths = [p for p in paths if path_accessible(p)]

请注意,它会检查路径是否可访问 - 您可能因为凭据无效等原因无法访问 - 您可以通过添加相应的 except 子句来改进它。

P.S。如果您这样做是为了加载数据的增量,我建议您考虑使用 Auto Loader 的结构化流式处理(即使在 Trigger.Once 模式下) - 如果您有,从性能的角度来看可能会更好您的目录中有很多文件。