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

Posted

技术标签:

【中文标题】检查 Databricks 笔记本中是不是存在 S3 目录【英文标题】:Check for S3 directory existence in Databricks notebook检查 Databricks 笔记本中是否存在 S3 目录 【发布时间】:2021-03-01 21:25:37 【问题描述】:

我在 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 中是否存在文件夹/目录?我尝试过使用dbutils,但要么我正在使用不同的版本,要么我不知道我在做什么(可能两者兼而有之),因为没有任何效果。我对 Databricks 很陌生,所以如果我能澄清这个问题,请告诉我。

【问题讨论】:

【参考方案1】:

你可以使用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 子句来改进它。

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

【讨论】:

由于某种原因,我根本无法访问dbutils.fs。我执行import dbutils,然后dir(dbutils) 产生['Console', 'DBUtils', 'FileInfo', 'Iterable', 'ListConverter', 'MapConverter', 'MountInfo', 'NotebookExit', 'Py4JJavaError', 'SecretMetadata', 'SecretScope', 'WidgetsHandlerImpl', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'absolute_import', 'makeTensorboardManager', 'namedtuple', 'print_function', 'range', 'stderr', 'stdout', 'string_types', 'sys', 'zip']。也许我正在使用不同版本的 Databricks 或其他东西?我不确定。 好的,所以,我对如何使用dbutils 感到困惑;它不应该被导入。相反,它是启动时 Databricks 笔记本的一部分。鉴于此,您的解决方案完美运行,谢谢!至于使用 Auto Loader,我将不得不对此进行更多研究。对于不自动读取的 S3 存储桶,您有什么推荐的阅读材料吗? 文档应该足够了

以上是关于检查 Databricks 笔记本中是不是存在 S3 目录的主要内容,如果未能解决你的问题,请参考以下文章

检查 .NET 中是不是存在 azure databricks 挂载点

如果 Databricks 或 Spark SQL 中存在表,则插入

databricks:检查挂载点是不是已挂载

使用 Python/Scala 的 Databricks 雪花表

什么是好的 Databricks 工作流程

变量值必须传入 Databricks 直接 sql 查询而不是 spark.sql(""" """)