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