如何使用 arrow::open_dataset 连接到 Azure Blob 存储中的镶木地板文件?
How to connect to parquet files in Azure Blob Storage with arrow::open_dataset?
我愿意接受其他方法。这是我的约束条件:
- 我在 Azure Blob 存储的容器中有镶木地板文件
- 这些镶木地板文件将按产品 ID 以及日期 (year/month/day)
进行分区
- 我正在 R 中执行此操作,并希望能够进行交互连接(不仅仅是在数据块中设置一个笔记本,尽管这是我稍后可能想弄清楚的事情)
这是我能做的:
- 我了解如何使用
arrow::open_dataset()
连接到本地 parquet 目录:ds <- arrow::open_dataset(filepath, partitioning = "product")
- 我可以使用
AzureStor
程序包连接到我的 blob 容器,并从中查看和下载。我可以通过这种方式下载单个镶木地板文件并将其转换为数据框:
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 中做到这一点。
Arrow-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服务器数据库给他们。
我愿意接受其他方法。这是我的约束条件:
- 我在 Azure Blob 存储的容器中有镶木地板文件
- 这些镶木地板文件将按产品 ID 以及日期 (year/month/day) 进行分区
- 我正在 R 中执行此操作,并希望能够进行交互连接(不仅仅是在数据块中设置一个笔记本,尽管这是我稍后可能想弄清楚的事情)
这是我能做的:
- 我了解如何使用
arrow::open_dataset()
连接到本地 parquet 目录:ds <- arrow::open_dataset(filepath, partitioning = "product")
- 我可以使用
AzureStor
程序包连接到我的 blob 容器,并从中查看和下载。我可以通过这种方式下载单个镶木地板文件并将其转换为数据框:
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 中做到这一点。
Arrow-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服务器数据库给他们。