Spark RDD - Scala写和Python读

时间:2017-03-28 16:33:32

标签: python json scala apache-spark rdd

我有一个简单的Spark Scala脚本,它读取一堆日志文件并返回RDD[Map[String, String]]

我正努力将Scala RDD导出到pyspark用户。

首先尝试使用Jackson编写一个json文件。

val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
val rec = sc.textFile("/path/to/log/file.log").

  [ omissis ]

rec.map(f => mapper.writeValueAsString(f))
rec.saveAsTextFile("/path/to/export.json");

但是当我们试图在pyspark中读取json时

spark.read.json("/path/to/export.json").take(5) 

引发异常

org.apache.spark.sql.AnalysisException: Reference '11E' is ambiguous, could be: 11E#20457, 11E#20458.;
  at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolve(LogicalPlan.scala:264)

在Scala中实现Scala和Python之间的互操作性是否有最佳实践?

在Scala中保存RDD并在Python中重用它的效果更好?

pyspark用户很可能会在他身边提交sql查询,这是导出我工作结果的好方法吗?

1 个答案:

答案 0 :(得分:0)

也许它可以帮到你。

Gist允许您通过pyspark调用Scala代码。那是Kafka与kerberos的制片人。

查看scala代码示例:

import org.apache.spark.api.java.JavaRDD
import org.apache.spark.api.python.SerDeUtil
def fooScala(): JavaRDD[Array[Byte]] = {
    rdd = sc.parallelize(1 to 10)
    SerDeUtil.javaToPython(rdd)
}

之后,您需要编译代码并生成项目的jar。

在pySpark中,您可以像这样调用类:

from pyspark.rdd import RDD
_jvm = sc._jvm
python_rdd = _jvm.yourClassPath.fooScala()

这个过程可以帮助你做你想做的事。

要在pyspark内调用jar,你必须通过spark-submit调用,如下所示:

spark-submit --master yarn-client --jars ./my-scala-code.jar --driver-class-path ./my-scala-code.jar main.py