2016-03-01 19 views
6

Jeśli mam akapit Scala z DataFrame, mogę udostępnić i używać go w python. (Jak rozumiem pyspark wykorzystuje py4j)Zeppelin: Scala Dataframe do Pythona

Próbowałem to:

Scala ustęp:

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

Python ustęp:

%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() 

Błąd:

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__' 

Rozwiązanie:

%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

Odpowiedz

18

Można zarejestrować DataFrame jako tymczasowy tabeli w Scala:

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

i przeczytać go w Pythonie z SQLContext.table:

df = sqlContext.table("df") 

Jeśli naprawdę chcę użyć put/get musisz budować od podstaw Pythona DataFrame:

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

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

Aby wykreślić z matplotlib będziesz musiał konwertować DataFrame do lokalnego obiektu Pythona albo collect lub toPandas:

pdf = df.toPandas() 

Należy pamiętać, że pobierze on dane do sterownika.

Zobacz także moving Spark DataFrame from Python to Scala whithn Zeppelin

+0

Podczas korzystania Spark 1.6.0 lub starszej, musisz jawnie zadeklarować nową SqlContext dla każdego języka, którego używasz. W rzeczywistości, z powodu błędu [SPARK-13180] (https://issues.apache.org/jira/browse/SPARK-13180), HiveContext stworzony przez Zeppelin podczas uruchamiania nie działa. W tym przypadku jedynym sposobem na udostępnienie DataFrame w Pythonie i Scali jest umieszczenie odnośnika Dataframe w kontekście Zeppelin od Scala i odzyskanie go z Pythona za pomocą 'DataFrame (z.get (" df "), sqlContext)'. –

+0

tworząc kuszące, do którego można uzyskać dostęp w "% sql" – Junaid