python - 将 spark 数据帧转换为 pandas 数据帧 - ImportError: Pandas >= 0.19.2 must be installed
问题描述
我正在尝试将 spark 转换DataFrame
为 pandas DataFrame
。我正在尝试在 EMR 上使用 Jupyter 笔记本。我正在尝试以下错误。
Pandas 库安装在我的用户下的主节点上。并且使用 spark shell (pyspark) 我能够在该主节点上将 df 转换为 pandas df。
以下命令已在所有主节点上执行:
pip --no-cache-dir install pandas --user
以下是在主节点上工作。但不是来自pyspark 笔记本:
import Pandas as pd
错误:
名为“Pandas”的模块
Traceback(最近一次调用最后一次):
ModuleNotFoundError:没有名为“Pandas”的模块
更新:
我可以从 python 笔记本运行以下代码:
import pandas as pd
pd.DataFrame(["a", "b"], columns=['q_data'])
解决方案
当我们运行 EMR 5.33.0 步骤来创建和操作数据帧时,我们也不断收到以下错误。
File "/mnt/tmp/spark-49de09b2-5f77-4c46-a562-eed3742852be/test.py", line 131, in <module>
stores = df.toPandas()['storename'].unique().tolist()
File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/dataframe.py", line 2086, in toPandas
File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py", line 129, in require_minimum_pandas_version
ImportError: Pandas >= 0.19.2 must be installed; however, it was not found.
这是一个误导性错误,因为它是由 numpy 和 pandas 包的版本不匹配冲突引起的。我们的 AWS 支持能够找到这个。
EMR 在安装一组库的自定义引导操作(您指定)之后运行它自己的引导。安装这些版本的“numpy”包会导致冲突。例如,当我们使用引导脚本安装“pandas==1.3.0”时,它会安装“numpy=1.21.2”。但是,作为 EMR 引导程序(也称为应用程序配置)的一部分,它正在安装“numpy=1.16.5”。因此,pip3 解释的内容和 python/pyspark 解释的内容之间的 numpy 版本不匹配。
要解决这个问题,
第 1 步:创建辅助引导操作脚本并将其上传到 S3
#!/bin/bash
# keep checking the status of node provisioning, once it's SUCCESSFUL, run your code
while true; do
NODEPROVISIONSTATE=` sed -n '/localInstance [{]/,/[}]/{
/nodeProvisionCheckinRecord [{]/,/[}]/ {
/status: / { p }
/[}]/a
}
/[}]/a
}' /emr/instance-controller/lib/info/job-flow-state.txt | awk ' { print $2 }'`
if [ "$NODEPROVISIONSTATE" == "SUCCESSFUL" ]; then
sleep 10;
echo "Running my post provision bootstrap"
sudo pip3 install pandas==1.3.0
fi
sleep 10;
done
第 2 步:修改现有的引导脚本
#!/bin/bash -x
aws s3 cp s3://<BUCKET>/secondary-bootstrap.sh /home/hadoop/secondary-bootstrap.sh && sudo bash /home/hadoop/secondary-bootstrap.sh &
exit 0
第 3 步:重新启动您的 EMR 集群
推荐阅读
- reactjs - 如何使用 Cookie 进行存储 jwt 令牌用户认证?
- php - 如何在 WooCommerce 的结帐页面上禁用更改运输方式的功能
- javascript - Cordova "Origin: file://"-Error using and Android 10, old versions working
- mysql - 如何多次选择一行,每行附加不同的值?
- javascript - try/catch 块中的多个依赖 API 调用?(NodeJS)
- c# - 尝试删除租用的 blob 时收到错误“当前 blob 上存在租约且未指定租约 ID”?
- amazon-web-services - Kubernetes Ingress Controller - 它有什么需求?
- javascript - 如何从对象数组中取出公共数组
- python - 嵌套列表的元素
- azure-data-factory - 无法为 Azure 数据工厂添加新的集成运行时