【问题标题】:R read ORC file from S3R从S3读取ORC文件
【发布时间】:2017-08-14 19:01:40
【问题描述】:

我们将在 AWS 上托管一个 EMR 集群(带有 Spot 实例),该集群在 S3 存储桶之上运行。数据将以 ORC 格式存储在此存储桶中。但是,我们想使用 R 以及某种沙盒环境,读取相同的数据。

我的包 aws.s3 (cloudyr) 运行正常:我可以毫无问题地读取 csv 文件,但似乎不允许我将 orc 文件转换为可读的文件。

我在网上找到的两个选项是 -火花R - 数据连接器(垂直)

由于在 Windows 机器上安装 dataconnector 很麻烦,我安装了 SparkR,现在我可以读取本地 orc.file(我机器上的 R 本地,我机器上本地的 orc 文件)。但是,如果我尝试 read.orc,默认情况下它会将我的路径标准化为本地路径。深入研究源代码,我运行了以下代码:

sparkSession <- SparkR:::getSparkSession()
options <- SparkR:::varargsToStrEnv()
read <- SparkR:::callJMethod(sparkSession, "read")
read <- SparkR:::callJMethod(read, "options", options)
sdf <- SparkR:::handledCallJMethod(read, "orc", my_path)

但是我得到了以下错误:

Error: Error in orc : java.io.IOException: No FileSystem for scheme: https

有人可以帮我解决这个问题,或者指出另一种从 S3 加载 orc 文件的方法吗?

【问题讨论】:

  • 您已标记此vertica。您是否已经在使用 R 读取 Vertica 中的数据,并且卡在 ORC/S3 部分?
  • 我标记了 vertica,因为 R 包数据连接器是 Vertica 产品。实际上我正在使用 R 来读取 R 本身并且我被困在 ORC 部分(从 S3 读取工作,但不是以可读格式)。
  • 什么版本的 Vertica? (最近几年,ORC 集成一直在积极开发中。)我可以在 ORC -> Vertica 方面提供帮助,但我对 R 部分一无所知。这对你有帮助吗?
  • 目前它不是一个解决方案,因为它是来自 Vertica 的 R 包,但不是真正的 Vertica。如果我找不到解决方案,我可能会转向 Vertica,然后它会变得很方便。
  • @WannesRosiers 对此有何更新?我目前面临同样的挑战(尝试直接在 R 中从 S3 读取 ORC 文件)。谢谢!

标签: r amazon-s3 sparkr orc


【解决方案1】:

编辑后的答案:现在您可以直接从 S3 读取,而不是先从本地文件系统下载和读取

应 mrjoseph 的要求:通过 SparkR 的可能解决方案(首先我不想这样做)。

# Set the System environment variable to where Spark is installed
Sys.setenv(SPARK_HOME="pathToSpark")
Sys.setenv('SPARKR_SUBMIT_ARGS'='"--packages" "org.apache.hadoop:hadoop-aws:2.7.1" "sparkr-shell"')

# Set the library path to include path to SparkR
.libPaths(c(file.path(Sys.getenv("SPARK_HOME"),"R","lib"), .libPaths()))

# Set system environments to be able to load from S3
Sys.setenv("AWS_ACCESS_KEY_ID" = "myKeyID", "AWS_SECRET_ACCESS_KEY" = "myKey", "AWS_DEFAULT_REGION" = "myRegion")

# load required packages
library(aws.s3)
library(SparkR)

## Create a spark context and a sql context
sc<-sparkR.init(master = "local")
sqlContext<-sparkRSQL.init(sc)

# Set path to file
path <- "s3n://bucketname/filename.orc"

# Set hadoop configuration
hConf = SparkR:::callJMethod(sc, "hadoopConfiguration")
SparkR:::callJMethod(hConf, "set", "fs.s3n.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
SparkR:::callJMethod(hConf, "set", "fs.s3n.awsAccessKeyId", "myAccesKey")
SparkR:::callJMethod(hConf, "set", "fs.s3n.awsSecretAccessKey", "mySecrectKey")

# Slight adaptation to read.orc function
sparkSession <- SparkR:::getSparkSession()
options <- SparkR:::varargsToStrEnv()
# Not required: path <- normalizePath(path)
read <- SparkR:::callJMethod(sparkSession, "read")
read <- SparkR:::callJMethod(read, "options", options)
sdf <- SparkR:::handledCallJMethod(read, "orc", path)
temp <- SparkR:::dataFrame(sdf)

# Read first lines
head(temp)

【讨论】:

  • 如果您的 spark 版本是针对 Hadoop 2.7.x 或更高版本构建的,请使用 s3a: URL,包括切换到其身份验证(这不仅仅是在配置键中将 s3n 替换为 s3a) . S3A 将自动获取 AWS_ 环境变量机密,而在 EC2 上,VM 拥有自己的凭据——您的生活实际上可能会更轻松。
猜你喜欢
  • 2020-09-21
  • 2020-08-11
  • 2015-08-27
  • 2017-08-07
  • 2015-12-19
  • 2021-04-29
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
相关资源
最近更新 更多