Zeppelin:Scala Dataframe 到 python
Posted
技术标签:
【中文标题】Zeppelin:Scala Dataframe 到 python【英文标题】:Zeppelin: Scala Dataframe to python 【发布时间】:2016-03-01 09:32:52 【问题描述】:如果我有一个带有 DataFrame 的 Scala 段落,我可以与 python 共享和使用它吗? (据我了解,pyspark 使用 py4j)
我试过这个:
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
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)
【问题讨论】:
【参考方案1】:您可以在 Scala 中将DataFrame
注册为临时表:
// registerTempTable in Spark 1.x
df.createTempView("df")
并在 Python 中使用SQLContext.table
阅读它:
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)
要使用matplotlib
进行绘图,您需要使用collect
或toPandas
将DataFrame
转换为本地Python 对象:
pdf = df.toPandas()
请注意,它将获取数据给驱动程序。
另见moving Spark DataFrame from Python to Scala whithn Zeppelin
【讨论】:
使用 Spark 1.6.0 或更早版本时,您需要为您使用的每种语言显式声明一个新的 SQLContext。事实上,由于SPARK-13180 错误,Zeppelin 在启动时创建的 HiveContext 无法正常工作。在这种情况下,我发现在 Python 和 Scala 之间共享 DataFrame 的唯一方法是将 Dataframe 引用本身放在 Scala 的 Zeppelin 上下文中,并使用DataFrame(z.get("df"), sqlContext)
从 Python 中恢复它。
通过创建任何 temptable,您可以在 %sql
中访问它以上是关于Zeppelin:Scala Dataframe 到 python的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apache Zeppelin 重新运行带有 -deprecation 的 Scala 代码
Zeppelin:如何使用 sql 读取 DataFrame
如何在 Zeppelin/Spark/Scala 中漂亮地打印数据框?
如何使用 Scala 2.12 Zeppelin Notebook
在 zeppelin 中使用从 %pyspark 到 %python 的 Dataframe
Zeppelin Apache - 使用 Angular 添加下载按钮,以便下载 Pandas 或 PySpark Dataframe