我正在尝试使用 elasticsearch-hadoop-2.1.0.rc1.jar
将 SparkR 1.4.0 连接到 Elasticsearch jar 文件(找到 here)。它需要一些黑客攻击,调用 SparkR:::callJMethod
功能。我需要获得 jobj
几个 Java 类的 R 对象。对于某些类(class),这有效:
SparkR:::callJStatic('java.lang.Class',
'forName',
'org.apache.hadoop.io.NullWritable')
但对其他人来说,它不会:
SparkR:::callJStatic('java.lang.Class',
'forName',
'org.elasticsearch.hadoop.mr.LinkedMapWritable')
产生错误:
java.lang.ClassNotFoundException:org.elasticsearch.hadoop.mr.EsInputFormat
似乎 Java 没有找到
org.elasticsearch.*
类,即使我已经尝试在命令行中包含它们 --jars
论点和 sparkR.init(sparkJars = ...)
功能。任何帮助将不胜感激。此外,如果这是一个更适合实际 SparkR 问题跟踪器的问题,有人可以指点我吗?我看了看,没能找到。另外,如果有人知道另一种方法来 Hook
SparkR
高达 Elasticsearch
,我也很高兴听到这个消息。谢谢!
本
最佳答案
这是我实现它的方法:
# environments, packages, etc ----
Sys.setenv(SPARK_HOME = "/applications/spark-1.4.1")
.libPaths(c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib"), .libPaths()))
library(SparkR)
# connecting Elasticsearch to Spark via ES-Hadoop-2.1 ----
spark_context <- sparkR.init(master = "local[2]", sparkPackages = "org.elasticsearch:elasticsearch-spark_2.10:2.1.0")
spark_sql_context <- sparkRSQL.init(spark_context)
spark_es <- read.df(spark_sql_context, path = "index/type", source = "org.elasticsearch.spark.sql")
printSchema(spark_es)
(OS X Yosemite 上的 Spark 1.4.1、Elasticsearch 1.5.1、ES-Hadoop 2.1)
关键思想是链接到 ES-Hadoop 包而不是 jar 文件,并使用它直接创建 Spark SQL 上下文。
关于elasticsearch - Spark R 1.4.0 : how to include jars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31056399/