Spark RDD-Scala写入和Python读取

Spark RDD-Scala写入和Python读取,python,json,scala,apache-spark,rdd,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 ] re

我有一个简单的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代码。这是带有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()
spark-submit --master yarn-client --jars ./my-scala-code.jar --driver-class-path ./my-scala-code.jar main.py
这个过程可以帮助你做你想做的事情

要在pyspark中调用jar,必须通过spark submit进行如下调用:

from pyspark.rdd import RDD
_jvm = sc._jvm
python_rdd = _jvm.yourClassPath.fooScala()
spark-submit --master yarn-client --jars ./my-scala-code.jar --driver-class-path ./my-scala-code.jar main.py

有几种方法可以从pySpark调用scala方法。这种解决方案对你有帮助吗?我的意思是,通过pyspark调用scala进程,并以RDD的形式从该方法获得返回。您检查过DataFrameAPI吗?我想它也许能解决你的问题problem@JamesTobin是的,但我可能是新手,了解如何使用it@ThiagoBaldim我正在尝试导出一个hashmap列表,如果对应的python能够按原样阅读,那将非常棒。谢谢您的建议,我来试试你如何从一个对象中访问SerDeUtil?