You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无Spark环境下用R读取和写入S3中的Parquet文件

解决R在无Spark环境下读取S3中Parquet文件的问题

没问题!既然你已经能通过aws.s3处理S3上的CSV文件,但卡在了Parquet格式上,而且服务器没装Spark,那咱们用arrow包就能完美解决这个问题——它原生支持S3和Parquet,完全不需要依赖Spark,操作还简单。

步骤1:安装并加载必要的包

我们需要arrow来处理Parquet格式和S3访问,aws.s3可以复用你已有的AWS配置(如果有的话):

# 首次使用先安装包
install.packages(c("arrow", "aws.s3"))

# 加载包
library(arrow)
library(aws.s3)

步骤2:确认AWS认证配置

如果你已经能用aws.s3正常访问S3,那arrow会自动复用你的AWS认证(比如环境变量、~/.aws/credentials文件、服务器IAM角色等)。如果需要手动指定凭证,可以设置环境变量:

# 可选:手动配置AWS凭证(仅当无默认配置时使用)
Sys.setenv(
  AWS_ACCESS_KEY_ID = "你的AWS访问密钥",
  AWS_SECRET_ACCESS_KEY = "你的AWS秘密密钥",
  AWS_REGION = "你的S3桶所在区域"
)

步骤3:读取S3上的Parquet文件

读取单个Parquet文件

直接用read_parquet()传入S3路径即可:

# 读取单个Parquet文件
parquet_data <- read_parquet("s3://mn-dl.sandbox/Internal Data/test.parquet")

读取Parquet分区数据集(多个Parquet文件组成的目录)

如果你的数据是按目录分区存储的(比如按日期、类别分文件夹),用open_dataset()可以高效处理:

# 打开Parquet分区数据集
parquet_dataset <- open_dataset("s3://mn-dl.sandbox/Internal Data/parquet_partitioned_dir/")

# 可以像操作数据框一样查询,比如取前10行并转换为数据框
dataset_sample <- parquet_dataset %>% head(10) %>% collect()

步骤4:将数据写入S3为Parquet格式

同样用arrow的函数,操作和读取一样简单:

# 将数据框写入单个Parquet文件到S3
write_parquet(
  data1,  # 你的目标数据框
  "s3://mn-dl.sandbox/Internal Data/output.parquet"
)

# 可选:写成分区数据集(按指定列拆分存储)
write_dataset(
  data1,
  "s3://mn-dl.sandbox/Internal Data/output_parquet_partition/",
  format = "parquet",
  partitioning = c("category_column")  # 替换为你要分区的列名
)

为什么不用aws.s3直接处理?

Parquet是二进制列存格式,和CSV这类文本格式不同,不能通过rawToChar转换后直接读取。arrow专门优化了列式存储的处理逻辑,还原生集成了S3访问能力,完全不需要Spark这类重型依赖,正好匹配你的场景。


内容的提问来源于stack exchange,提问作者Pallavi Verma

火山引擎 最新活动