繁体   English   中英

Spark RDD-Scala写和Python读

[英]Spark RDD - Scala write and Python read

我有一个简单的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查询,这是导出我的工作结果的好方法吗?

也许可以帮到您。

有一个要点 ,使您可以通过pyspark调用Scala代码。 那是一家生产卡夫卡啤酒的人。

查看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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM