%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 中的先前单元格读取变量的主要内容,如果未能解决你的问题,请参考以下文章

AWS .NET SDK 更新用户内联(嵌入式)策略

Matplotlib 中的内联标签

在 Spyder IDE 中使用 Matplotlib 绘制内联或单独的窗口

尝试使用 matplotlib 内联绘图时,为啥在 jupyter notebook 中出现 NonGuiException?

python matplotlib内联

在 matplotlib 内联和 QT 后端之间切换 Python 脚本