如何使用 arrow::open_dataset 连接到 Azure Blob 存储中的镶木地板文件?

How to connect to parquet files in Azure Blob Storage with arrow::open_dataset?

我愿意接受其他方法。这是我的约束条件:

这是我能做的:

blob <- AzureStor::storage_endpoint("{URL}", key="{KEY}")
cont <- AzureStor::storage_container(blob, "{CONTAINER-NAME}")
parq <- AzureStor::storage_download(cont, src = "{FILE-PATH}", dest = NULL)
df <- arrow::read_parquet(parq)

我一直无法弄清楚的是如何使用 arrow::open_dataset() 引用 {FILE-PATH} 的父目录,其中我有所有镶木地板文件,使用与容器的连接我用 AzureStor 创建的。 arrow::open_dataset() 只接受字符向量作为“sources”参数。如果我只是给它 URL 路径,我不会传递任何类型的凭据来访问容器。

不幸的是,您今天可能无法完全从 R 中做到这一点。

A​​rrow-R 基于 Arrow-C++,而 Arrow-C++ 还没有针对 Azure 的文件系统实现。有 JIRA 票证 ARROW-9611,ARROW-2034 用于创建,但这些票证目前未在进行中。

在 python 中,可以使用 FSspec adapter 完全在 python 中创建文件系统。由于有一个用于 Azure Blob 存储的 python SDK,因此今天应该可以在 python.

中执行您想要的操作

大概可以为 R 创建类似的东西,但您仍然需要创建与 fsspec 适配器等效的 R,这将涉及一些 C++ 代码。

如果您使用 Azure Synapse,那么您可以使用 odbc 连接到您的数据,就好像它是 SQL 服务器数据库一样,它还支持分区和其他文件类型。据我所知,定价大约是 5 美元/月固定加上 5 美元/TB 查询。

查询数据看起来像这样...

library(odbc)
syncon <- dbConnect(odbc(),
                    Driver = "SQL Server Native Client 11.0",
                    Server = "yourname-ondemand.sql.azuresynapse.net",
                    Database = "dbname",
                    UID = "sqladminuser",
                    PWD = rstudioapi::askForPassword("Database password"),
                    Port = 1433)

somedata <- dbGetQuery(syncon, r"---{SELECT top 100 
                       result.filepath(1) as year,
                       result.filepath(2) as month,
                       *
           FROM
           OPENROWSET(
           BULK 'blobcontainer/directory/*/*/*.parquet',
           DATA_SOURCE='blobname',
           FORMAT = 'parquet'
           
           ) as [result]
           
           order by node, pricedate, hour}---")

filepath关键字指的是BULK路径中的目录名。

这是 MS 网站 https://docs.microsoft.com/en-us/azure/synapse-analytics/sql/query-specific-files

您还可以制作视图,以便喜欢 SQL 但不喜欢 parquet 文件的人可以查询视图,而无需了解底层数据结构,它看起来就像 SQL服务器数据库给他们。