使用 Azure databricks /Synapse notebooks 中的 Json.load 从 Azure datalake 读取 Json 文件作为文件

Posted

技术标签:

【中文标题】使用 Azure databricks /Synapse notebooks 中的 Json.load 从 Azure datalake 读取 Json 文件作为文件【英文标题】:Reading Json file from Azure datalake as a file using Json.load in Azure databricks /Synapse notebooks 【发布时间】:2021-12-29 16:09:52 【问题描述】:

我正在尝试解析具有多嵌套级别的 Json 数据。我使用的方法是给出文件名并使用 open(File-name) 加载数据。当我提供数据湖路径时,它会抛出找不到文件路径的错误。我能够读取数据帧中的数据,但是如何从数据湖读取文件而不转换为数据帧并将其作为文件读取并打开?

本地机器上的当前代码方法正在运行:

f = open(File_Name.Json)
data = json.load(f)

提供数据湖路径时失败的场景:

f = open(Datalake path/File_Name.Json)
data = json.load(f)

【问题讨论】:

【参考方案1】:

您需要将数据湖文件夹挂载到 dbfs(在 Databricks 中)中的某个位置,尽管挂载存在安全风险。任何有权访问 Databricks 资源的人都可以访问所有已安装的位置。 安装到 dbfs 的文档:https://docs.databricks.com/data/databricks-file-system.html#mount-object-storage-to-dbfs

【讨论】:

【参考方案2】:

open 函数仅适用于本地文件,无法理解(开箱即用)云文件路径。您当然可以尝试挂载云存储,但正如@ARCrow 所提到的,这将是一个安全风险(直到您创建所谓的passthrough mount 来控制云存储级别的访问)。

但是,如果您能够将文件读入数据帧,则意味着集群具有访问云存储所需的所有设置 - 在这种情况下,您只需使用 dbutils.fs.cp command 将文件从云存储复制到本地磁盘,然后用open函数打开它。像这样的:

dbutils.fs.cp("Datalake path/File_Name.Json", "file:///tmp/File_Name.Json")
with open("/tmp/File_Name.Json", "r") as f:
  data = json.load(f)

【讨论】:

以上是关于使用 Azure databricks /Synapse notebooks 中的 Json.load 从 Azure datalake 读取 Json 文件作为文件的主要内容,如果未能解决你的问题,请参考以下文章

Azure Data PlatformETL工具(21)——Azure Databricks使用——访问Azure Blob

Azure Databricks - 解释 databricks 中的安装语法

使用 databricks-connect 的 Azure 数据块连接

如何强制 Azure 数据工厂数据流使用 Databricks

使用 Powershell 脚本生成 Azure Databricks 令牌

Azure Databricks 的 Azure DevOps 管道