如何在同一个Spark项目中同时使用Scala和Python?

时间:2015-10-06 17:05:26

标签: python scala apache-spark pyspark spark-streaming

是否可以将 Spark RDD 传递给Python?

因为我需要一个python库来对我的数据进行一些计算,但我的主要Spark项目是基于Scala的。 有没有办法混合它们或让python访问相同的火花上下文?

3 个答案:

答案 0 :(得分:17)

您确实可以使用Scala和Spark以及常规Python脚本来管理python脚本。

<强> test.py

#!/usr/bin/python

import sys

for line in sys.stdin:
  print "hello " + line

spark-shell(scala)

val data = List("john","paul","george","ringo")

val dataRDD = sc.makeRDD(data)

val scriptPath = "./test.py"

val pipeRDD = dataRDD.pipe(scriptPath)

pipeRDD.foreach(println)

<强>输出

你好约翰

hello ringo

你好乔治

你好保罗

答案 1 :(得分:7)

您可以通过Spark中的管道运行Python代码。

使用pipe(),您可以编写RDD转换,将标准输入中的每个RDD元素作为String读取,根据脚本指令操作该String,然后将结果作为String写入标准输出。

SparkContext.addFile(path),我们可以在Spark作业启动时为每个工作节点添加文件列表。所有工作节点都将拥有脚本的副本,因此我们将通过以下方式获得并行操作管。我们需要在所有worker和executor节点上安装所有库和依赖项。

示例:

Python文件:将输入数据设为大写的代码

#!/usr/bin/python
import sys
for line in sys.stdin:
    print line.upper()

Spark Code :用于管道数据

val conf = new SparkConf().setAppName("Pipe")
val sc = new SparkContext(conf)
val distScript = "/path/on/driver/PipeScript.py"
val distScriptName = "PipeScript.py"
sc.addFile(distScript)
val ipData = sc.parallelize(List("asd","xyz","zxcz","sdfsfd","Ssdfd","Sdfsf"))
val opData = ipData.pipe(SparkFiles.get(distScriptName))
opData.foreach(println)

答案 2 :(得分:-2)

如果我理解正确,只要您从TypeInterface获取数据并将其转换为RDDSparkContext,您就可以使用pyspark使用Spark Python API操纵数据。

您还可以使用programming guide来使用scala

中的不同语言