2016-03-01 10 views
6

DataFrameを持つScala段落を共有して、Pythonで使用することはできますか?Zeppelin:ScalaデータフレームからPython

Scalaの段落:

x.printSchema 
z.put("xtable", x) 

Pythonの段落:

%pyspark 

import numpy as np 
import pandas as pd 

import matplotlib.pyplot as plt 
import seaborn as sns 

the_data = z.get("xtable") 

print the_data 

sns.set() 
g = sns.PairGrid(data=the_data, 
       x_vars=dependent_var, 
       y_vars=sensor_measure_columns_names + operational_settings_columns_names, 
       hue="UnitNumber", size=3, aspect=2.5) 
g = g.map(plt.plot, alpha=0.5) 
g = g.set(xlim=(300,0)) 
g = g.add_legend() 

エラー:

Traceback (most recent call last): 
    File "/tmp/zeppelin_pyspark.py", line 222, in <module> 
    eval(compiledCode) 
    File "<string>", line 15, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/seaborn/axisgrid.py", line 1223, in __init__ 
    hue_names = utils.categorical_order(data[hue], hue_order) 
TypeError: 'JavaObject' object has no attribute '__getitem__' 

私はこれを試してみました(私はそれを理解したようpysparkはpy4jを使用しています)ソリューション:

%pyspark 

import numpy as np 
import pandas as pd 

import matplotlib.pyplot as plt 
import seaborn as sns 

import StringIO 
def show(p): 
    img = StringIO.StringIO() 
    p.savefig(img, format='svg') 
    img.seek(0) 
    print "%html <div style='width:600px'>" + img.buf + "</div>" 

df = sqlContext.table("fd").select() 
df.printSchema 
pdf = df.toPandas() 

g = sns.pairplot(data=pdf, 
       x_vars=["setting1","setting2"], 
       y_vars=["s4", "s3", 
         "s9", "s8", 
         "s13", "s6"], 
       hue="id", aspect=2) 
show(g) 

cluster visualisation

答えて

18

あなたはScalaでは一時テーブルとしてDataFrameを登録することができます

// registerTempTable in Spark 1.x 
df.createTempView("df") 

SQLContext.tableとPythonでそれを読む:

df = sqlContext.table("df") 

あなたの場合本当に使用したいput/getあなたは最初からPythonのDataFrameを構築する必要があります:

z.put("df", df: org.apache.spark.sql.DataFrame) 
from pyspark.sql import DataFrame 

df = DataFrame(z.get("df"), sqlContext) 

をあなたはcollecttoPandasのいずれかでローカルのPythonオブジェクトにDataFrameを変換する必要がありますmatplotlibをプロットするには:

pdf = df.toPandas() 

ドライバにデータをフェッチすることに注意してください。

moving Spark DataFrame from Python to Scala whithn Zeppelin

+0

スパーク1.6.0または以前を使用して、明示的に使用する言語ごとに新しいSQLContextを宣言する必要があります参照してください。実際、[SPARK-13​​180](https://issues.apache.org/jira/browse/SPARK-13​​180)のバグのため、起動時にZeppelinによって作成されたHiveContextは機能しません。この場合、PythonとScalaでDataFrameを共有するための唯一の方法は、Dataframe参照自体をScalaのZeppelinコンテキストに置き、 'DataFrame(z.get(" df ")、sqlContext)でPythonから復元することです。 –

+0

あなたは '%sql'でアクセス可能な魅力的なものを作成します – Junaid

関連する問題