无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




