web-dev-qa-db-ja.com

ScalaとPython=同じプロジェクトで使用する方法Sparkプロジェクト?

Spark RDDをPythonにパイプすることは可能ですか?

データを計算するためにpythonライブラリが必要ですが、私のメインSpark=プロジェクトはScalaに基づいています。両方を混合する方法はありますか?またはpython同じアクセスspark context?

16
Wilson Liao

実際にpythonスクリプトを使用してScalaおよびSparkおよび通常のPythonスクリプト。

test.py

#!/usr/bin/python

import sys

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

スパークシェル(スカラ)

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

val dataRDD = sc.makeRDD(data)

val scriptPath = "./test.py"

val pipeRDD = dataRDD.pipe(scriptPath)

pipeRDD.foreach(println)

出力

こんにちは、ジョン

こんにちはリンゴ

こんにちはジョージ

こんにちはポール

20

SparkでPipeを介してPythonコードを実行できます。

Pipe()を使用すると、標準入力から各RDD要素を文字列として読み取り、スクリプトの指示に従ってその文字列を操作し、結果を標準出力に文字列として書き込むRDDの変換を書き込むことができます。

SparkContext.addFile(path)、Sparkジョブの開始時にダウンロードする各ワーカーノードのファイルのリストを追加できます。すべてのワーカーノードにスクリプトのコピーがあるので、すべてのライブラリと依存関係を、その前にすべてのワーカーノードとエグゼキューターノードにインストールする必要があります。

例:

Pythonファイル:入力データを大文字にするコード

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

スパークコード:データのパイピング用

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)
10
Ajay Gupta