在R中读取Azure Blob存储的.csv.gz文件时无法正常解压的问题
Azure Blob 直接读取.csv.gz文件解决方案
问题原因
readr读取本地.gz文件时会自动根据后缀识别压缩格式并完成解压,但读取Azure Blob的远程内容时,无论是直接传入SAS URL还是调用AzureStor的默认读取方法,都无法自动触发gzip解压流程,拿到的是未解压的二进制内容,因此无法正常解析为csv结构。
适配方案
你可以根据自己的使用场景选择以下任意一种方案修改代码:
方案1:基于带SAS令牌的URL直接读取
核心逻辑是先请求获取Blob的原始二进制内容,手动完成gzip解压后再交给read_delim解析:
library(httr) library(readr) # 拼接带SAS的Blob地址,和你原有逻辑一致 blob_urls_with_sas <- paste("https://name.blob.core.windows.net","/container/filename.csv.gz", sas_token, sep="") # 发送请求获取二进制内容,校验请求是否成功 resp <- GET(blob_urls_with_sas) stop_for_status(resp) # 建立二进制连接并挂载gzip解压流 raw_conn <- rawConnection(content(resp, as = "raw")) gz_conn <- gzcon(raw_conn) # 读取解压后的csv内容 dfAzure <- read_delim( gz_conn, delim=";", col_names=c('epoch','SegmentID','TT','Speed','LoS','Coverage'), col_types=cols( epoch = col_integer(), SegmentID = col_integer(), TT = col_integer(), Speed = col_integer(), LoS = col_integer(), Coverage = col_integer() ) ) # 用完手动关闭连接,避免内存泄漏 close(gz_conn) close(raw_conn)
方案2:基于AzureStor包读取
不需要把文件落地到本地磁盘,直接将Blob内容下载到内存连接后解压即可:
library(AzureStor) library(readr) # 创建可读写的临时内存连接 tmp_conn <- rawConnection(raw(0), "r+") # 将Blob内容下载到内存连接中 storage_download(cont, "filename.csv.gz", tmp_conn) # 重置连接指针到内容开头 seek(tmp_conn, 0) # 挂载gzip解压流 gz_conn <- gzcon(tmp_conn) # 读取解压后的csv内容 test <- read_delim( gz_conn, delim=";", col_names=c('epoch','SegmentID','TT','Speed','LoS','Coverage'), col_types=cols( epoch = col_integer(), SegmentID = col_integer(), TT = col_integer(), Speed = col_integer(), LoS = col_integer(), Coverage = col_integer() ) ) # 手动关闭连接释放内存 close(gz_conn) close(tmp_conn)
提示:如果运行时报缺少依赖包的错误,可先运行install.packages(c("httr", "readr", "AzureStor"))安装所需依赖
内容的提问来源于stack exchange,提问作者Marthe Uenk
相关产品推荐
相关产品推荐

