Alojaremos un clúster de EMR (con instancias puntuales) en AWS que se ejecutará sobre un depósito S3. Los datos se almacenarán en este depósito en formato ORC. Sin embargo, queremos usar R así como algún tipo de entorno de espacio aislado, leyendo los mismos datos.
Tengo el paquete aws.s3 (cloudyr) funcionando correctamente: puedo leer archivos csv sin problemas, pero parece que no me permite convertir los archivos orc en algo legible.
Las dos opciones que encontré en línea fueron - SparkR - conector de datos (vertica)
Dado que la instalación de dataconnector en una máquina con Windows era problemática, instalé SparkR y ahora puedo leer un archivo orc.file local (R local en mi máquina, archivo orc local en mi máquina). Sin embargo, si pruebo read.orc, por defecto normaliza mi ruta a una ruta local. Profundizando en el código fuente, ejecuté lo siguiente:
sparkSession <- SparkR:::getSparkSession() options <- SparkR:::varargsToStrEnv() read <- SparkR:::callJMethod(sparkSession, "read") read <- SparkR:::callJMethod(read, "options", options) sdf <- SparkR:::handledCallJMethod(read, "orc", my_path)Pero obtuve el siguiente error:
Error: Error in orc : java.io.IOException: No FileSystem for scheme: https¿Alguien podría ayudarme con este problema o indicarme una forma alternativa de cargar archivos orc desde S3?
Respuesta editada: ahora puede leer directamente desde S3 en lugar de descargar y leer primero desde el sistema de archivos local
A pedido de mrjoseph: una posible solución a través de SparkR (que en primer lugar no quería hacer).
# 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)