%matplotlib 内联魔术命令无法从 AWS-EMR Jupyterhub Notebook 中的先前单元格读取变量
Posted
技术标签:
【中文标题】%matplotlib 内联魔术命令无法从 AWS-EMR Jupyterhub Notebook 中的先前单元格读取变量【英文标题】:%matplotlib inline magic command fails to read variables from previous cells in AWS-EMR Jupyterhub Notebook 【发布时间】:2019-06-09 16:26:19 【问题描述】:在 AWS EMR jupyterhub 中将其转换为 pandas 数据帧后,我正在尝试使用 matplotlib 绘制 spark 数据集。
我可以使用 matplotlib 在单个单元格中进行绘图,如下所示:
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
df = [1, 1.6, 3, 4.2, 5, 4, 2.5, 3, 1.5]
plt.plot(df)
现在上面的代码 sn-p 非常适合我。
在这个示例示例之后,我继续从 AWS-EMR Jupyterhub 中的一个新/多个单元格中绘制我的 pandas 数据框,如下所示:
-Cell 1-
sparkDS=spark.read.parquet('s3://bucket_name/path').cache()
-Cell 2-
from pyspark.sql.functions import *
sparkDS_groupBy=sparkDS.groupBy('col1').agg(count('*').alias('count')).orderBy('col1')
pandasDF=sparkDS_groupBy.toPandas()
-cell 3-
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
plt.plot(pandasDF)
我的代码在单元格 3 中失败,并出现以下错误:
NameError: name 'pandasDF' is not defined
有人知道出了什么问题吗?
为什么我的 jupyterhub 笔记本中的新单元格无法识别上一个单元格中的变量?
它是否必须使用“%matplotlib inline”魔术命令(我也尝试使用“%matplotlib notebook”,但失败了)?
ps:我正在使用 AWS 5.19 EMR-Jupyterhub 笔记本设置来进行绘图工作。
这个错误有点像这个,但不是重复的 How do I make matplotlib work in AWS EMR Jupyter notebook?
【问题讨论】:
我看不到您在上述代码中的任何位置定义pandasDF
。有没有你没有给我们看的代码?
我在第二个单元格第三行将 spark 数据集转换为 pandas 数据帧,如下所示:pandasDF=sparkDS_groupBy.toPandas()
尽量简化问题。你可以打印数据框吗?如果没有,请从等式中删除 matplotlib。您可以使用 python 列表而不是数据框来获得相同的错误吗?如果是这样,请从问题中删除熊猫等。
打印数据框本身会出错。似乎 matplotlib 与 pyspark 内核有问题。在 python 内核中它运行良好
【参考方案1】:
您需要通过在单元格中输入%%help
来查看%%spark -o df_name
和%%local
函数。
具体来说,在你的情况下尝试:
-
在
-Cell 2-
的开头使用%%spark -o sparkDS_groupBy
,
以%%local
开头-Cell 3-
,
并在-Cell 3-
中绘制sparkDS_groupBy
而不是pandasDF
。
对于那些上下文较少的人,您可以通过在使用 PySpark 内核的 EMR Notebook 中实现以下内容来获取绘图,该内核附加到至少版本为 5.26.0 的 EMR 集群(引入了Notebook-Scoped Libraries。
(每个代码块代表一个Cell)
%% help
%%configure -f
"conf":
"spark.pyspark.python": "python3",
"spark.pyspark.virtualenv.enabled": "true",
"spark.pyspark.virtualenv.type":"native",
"spark.pyspark.virtualenv.bin.path":"/usr/bin/virtualenv"
sc.install_pypi_package("matplotlib")
%%spark -o my_df
# in this cell, my_df is a pyspark.sql.DataFrame
my_df = sc.read.text("s3://.../...")
%%local
%matplotlib inline
import matplotlib.pyplot as plt
# in this cell, my_df is a pandas.DataFrame
plt.plot(my_df)
【讨论】:
请注意,-o
标志可能存在限制。似乎每个%%spark
只尊重最后一个-o
标志的值。如果是这种情况,只需使用多个 %%spark
声明即可。
技术上,matplotlib
默认是可用的,所以不需要安装。以上是关于%matplotlib 内联魔术命令无法从 AWS-EMR Jupyterhub Notebook 中的先前单元格读取变量的主要内容,如果未能解决你的问题,请参考以下文章
在 Spyder IDE 中使用 Matplotlib 绘制内联或单独的窗口
尝试使用 matplotlib 内联绘图时,为啥在 jupyter notebook 中出现 NonGuiException?