首页 > 编程问答 >了解 Databricks 文件系统 (DBFS) 中的文件访问与使用 Python 和 Spark 的卷的比较

了解 Databricks 文件系统 (DBFS) 中的文件访问与使用 Python 和 Spark 的卷的比较

时间:2024-08-05 16:54:47浏览次数:15  
标签:python apache-spark file-io filesystems databricks

我当前正在尝试从 Databricks 文件系统 (DBFS) 读取和显示文件,但遇到了问题。这是我使用的代码:

file_path = "/dbfs/cluster-logs/use_case/default_job_cluster/cluster_id/init_scripts/cluster_id/20240801_proxy-init.sh.stderr.log"

with open(file_path, 'r') as file:
    contents = file.read()
    print(contents)

但是,有趣的是我收到以下错误:

bash: line 11: /Volumes/landing/default/artifacts/projects/use_case/databricks/scripts/proxy-init.sh: No such file or directory

如您所见,路径与原始输入不匹配。 最后,我能够使用以下代码正确读取并显示日志文件内容:

file_path = "/dbfs/cluster-logs/use_case/default_job_cluster/cluster_id/init_scripts/cluster_id/20240801_proxy-init.sh.stderr.log"

from pyspark.sql import functions as F
from pyspark.sql.functions import collect_list

if dbutils.fs.ls(file_path):
    file_df_to_check = spark.read.text(file_path).agg(collect_list("value").alias("all_lines"))
    display(file_df_to_check)

问题:

  1. 为什么第一个代码片段会产生引用卷路径的错误?
  2. 它是什么意思文档中的意思是 DBFS 为卷提供了 方案 ?那么第一个片段不应该工作吗?
  3. 为什么只能使用 Spark 读取文件,而不能使用标准的 Python open 函数读取文件?

感谢您的帮助。


让我们分解一下 Databricks 文件系统 (DBFS) 和卷,以澄清这些概念以及代码的行为方式。

  1. 错误和路径不匹配

你看到的错误 /Volumes/landing/default/artifacts/projects/use_case/databricks/scripts/proxy-init.sh 实际上暴露了你 Databricks 环境的后台。Databricks 集群在节点上运行,这些节点可能具有自己的本地文件系统。你在启动集群时选择的路径(在本例中为 /Volumes/landing/... )似乎已安装到 DBFS 上。

当你在 Databricks 笔记本中使用 open(file_path, 'r') 时,你正在使用 Python open 函数,该函数在 Databricks 集群节点 的本地文件系统上运行。初始代码段中的 file_path 指向 DBFS 位置,但错误消息表明代码尝试在本地安装的卷中访问 类似 的路径(这很可能是在你的 Databricks 工作区中镜像 DBFS 位置的自动安装)。

  1. DBFS 卷方案

你在 Microsoft 文档中提到的“DBFS 卷方案”指的是一种在 Databricks 中更持久、更协作地管理数据的结构化方法。它们与这个特定问题没有直接关系。它们提供了在 DBFS 中组织和管理数据的强大方法,但不会改变 open 函数的行为。

  1. 使用 Spark 与 Python 读取

你* 可以 使用标准 Python 的 open 函数读取 DBFS 文件,但你必须使用 dbutils.fs.cp() dbutils.fs.move() 将文件复制到本地文件系统或使用 dbutils API 读取文件:

file_path_dbfs = "/dbfs/cluster-logs/use_case/default_job_cluster/cluster_id/init_scripts/cluster_id/20240801_proxy-init.sh.stderr.log"
local_file_path = "/tmp/20240801_proxy-init.sh.stderr.log" 
dbutils.fs.cp(file_path_dbfs, local_file_path) 

with open(local_file_path, 'r') as file:
    contents = file.read()
    print(contents)

但是,Spark(你正在使用的方法)通常是 Databricks 中处理文件的推荐方法,原因如下:

  • 分布式处理: Spark 旨在跨集群处理大量数据。当你使用 spark.read.text() 时,Spark 会将文件拆分,并在多个节点上并行处理。这对于大型文件来说效率要高得多。
  • 数据框架: Spark 将数据加载到数据框架中,为转换、分析和轻松使用其他 Spark 功能提供了一种结构化格式。

总之

  • 你看到的错误是因为 open 函数在 Databricks 集群节点的本地文件系统上运行,而不是在 DBFS 上运行。
  • 虽然 DBFS 卷提供了组织数据的方法,但它们不影响 open 函数的此特定行为。
  • 你可以使用 dbutils.fs API 或将文件复制到本地文件系统来使用 Python 的 open 函数读取 DBFS 文件,但通常建议使用 Spark 读取和处理数据以获得更好的性能和集成。

标签:python,apache-spark,file-io,filesystems,databricks
From: 78820957

相关文章

  • 机器学习用python还是R,哪个更好?
    选择使用Python还是R进行机器学习取决于多个因素,包括您的具体需求、项目要求、个人偏好以及团队的技能水平。以下是一些关键点,可以帮助您做出决定:Python的优势广泛使用:Python是目前最流行的编程语言之一,特别是在数据科学和机器学习领域。它有一个庞大的社区和丰富的资源。......
  • python 元类:在调用“__set_name__”方法后编辑命名空间?
    假设我们用元类定义一个类。在类主体中,分配了对象,这些对象实现__set_name__以在类的数据结构中注册自身。是否可以在运行方法之后编辑命名空间?比如,分离填充的数据结构,将其分成两部分,然后在新属性下添加部分?__set_name__问题在于,在元类中调用之......
  • 无法加入进程,只能终止[Python 3.11,多处理]
    我有一个问题要问对Python的多处理库有更​​多经验的人,此时我几乎迷失了方向。我目前正在构建一个应该在Windows11和Windows11上运行的图像处理应用程序装有DebianLinux的OrangePi5。我的设置是,除了主程序之外,还有另外两个进程,一个用于处理不间断的......
  • Python 将Word转换为JPG、PNG、SVG图片
    将Word文档以图片形式导出,既能方便信息的分享,也能保护数据安全,避免被二次编辑。文本将介绍如何使用 Spire.DocforPython 库在Python程序中实现Word到图片的批量转换。Python将Word转换为JPG、JPEG、PNG、BMP等图片格式Python将Word文档转换为SVG格式 Python库安装: ......
  • C 和 Python 代码的函数的不同十六进制转储值
    这是我的示例C代码,用于从user32.dll中转储MessageBoxA:#include<windows.h>#include<stdio.h>voidDumpFun(HANDLEprocess,LPVOIDaddress,SIZE_Tdump_size){BYTE*buffer=(BYTE*)malloc(dump_size);if(buffer==NULL){pri......
  • 是否有对数累积分布函数 (CDF) 和分位数函数的数值稳定的 Python 实现?
    我正在寻找以下函数的数值稳定实现。由于我的应用涉及t分布,所以我这里以t分布为例。LogCDF#NaivePythonimplementationofthefunctionIneedimportscipyimportnumpyasnpdeft_log_cdf(x,df):p=scipy.stats.t.cdf(x,df=df)returnnp.log(......
  • 如何将 *args 参数作为字符串传递给 Python 函数
    我正在使用pytubefix制作一个Youtube下载器。API允许我编写如下代码:YouTube(url).streams.filter(progressive=True)但是假设我有一个字符串存储在像args="progressive=True"这样的变量中,我如何使用args字符串来调用函数,就像......
  • Python Telegram Bot 从数据库获取数据时出错
    我正在开发用于管理企业用途任务的电报机器人。团队负责人注册他的公司并获得唯一的ID,然后可以分配任务。问题是,当团队负责人分配任务时,他可以使用/viewtasks访问它们。但是,当员工尝试查看任务时,它会打印出“错误。您尚未注册”。似乎无法检索与用户关联的company_id,即使......
  • 在 Glue 作业中使用 python3+ 创建 CloudFront 签名 URL
    是否可以使用python3+为GlueJob中S3文件中的一个特定文件创建具有一定时间限制的CloudFront签名URL?我看到可以在Lambda中做到这一点,但在Python文档中找不到任何内容,特别是胶水工作。任何人都可以提供一些提示吗?defload_private_key(key_path):withopen(......
  • 【Python学习手册(第四版)】学习笔记14-迭代器和列表解析(一)
    个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。本文主要以通俗易懂的语言介绍迭代器(文件迭代、手动迭代iter和next等),列表解析式包括基础知识包括写法、文件上使用列表解析、扩展列表解析语法等,对列表解析不懂的同学着重推荐......