2015-10-06 97 views
9

是否有可能將Python Spark RDD如何在同一個Spark項目中同時使用Scala和Python?

因爲我需要一個python庫來對我的數據做一些計算,但是我的主要Spark項目是基於Scala的。 有沒有辦法將它們混合在一起或讓python訪問相同的spark上下文?

+0

我建議重寫PySpark中的代碼,但不是所有的Python庫s可以採取rdds。你正在使用哪個Python庫? – Michal

+0

你是否喜歡Spark操作的結果,還是想讓原始RDD在Python中操作?前者不僅是可能的,而且在大數據領域也是常見的。爲Spark結果編寫Python插件需要對細節進行適當的關注,但通常是一個好的解決方案。 您的互聯網搜索是如何提供這些信息的?您使用了哪些搜索條件? http://stackoverflow.com/help/how-to-ask。請發佈您的Spark API以及您想要與之交互的Python級別。 – Prune

+0

我想使用[Jieba](https://github.com/fxsjy/jieba)進行文本處理,這是一箇中文分詞庫。 我使用Spark Streaming + Kafka進行數據收集。現在的問題是我需要將原始數據傳輸到Python進行文本處理,然後將結果發送回其他Scala代碼進行其他分析。 –

回答

8

確實是可以管利用不同語言進行使用Scala的Python腳本和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) 

輸出

你好,約翰

你好林戈

你好喬治

你好保羅

+0

你有沒有跑過這段代碼? –

+0

只能在本地筆記本電腦上使用,而不能在羣集中使用。 –

+2

是的,我知道這種方法,但python腳本運行在執行器上,所以我有一個問題,如果我管道太多的數據外部腳本,工人會崩潰?我的意思是,外部Python腳本不是並行計算。 –

0

如果我理解正確的話,只要你從scala取數據,並將其隱蔽到RDDSparkContext,那麼你就可以使用pyspark操作使用星火的Python API的數據。

還有一個programming guide,你可以按照內spark

3

您可以通過星火管運行的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() 

星火代碼:滾邊用數據

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) 
相關問題