【问题标题】:converting spark dataframe to pandas dataframe - ImportError: Pandas >= 0.19.2 must be installed将 spark 数据帧转换为 pandas 数据帧 - ImportError: Pandas >= 0.19.2 must be installed
【发布时间】:2020-06-24 13:52:35
【问题描述】:

我正在尝试将 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

错误:

名为“熊猫”的模块
回溯(最近一次通话最后一次):
ModuleNotFoundError:没有名为“Pandas”的模块

更新:

我可以从 python notebook 运行以下代码:

import pandas as pd 
pd.DataFrame(["a", "b"], columns=['q_data']) 

【问题讨论】:

    标签: python pandas dataframe pyspark amazon-emr


    【解决方案1】:

    您需要在驱动程序节点上使用 pandas,因为在转换为 pandas df 时,所有数据都会收集到驱动程序然后进行转换

    【讨论】:

    • 它已经安装好了,我可以在主节点上将datafrae转换为pandas df。我只在 jypyter notebook 中遇到问题。
    • @GaurangShah 你的笔记本使用不同的解释器吗?
    • 我已经更新了这个问题。 Pandas 安装在所有主节点上。如果我在这些主节点上打开一个 spark-shell。我可以从 spark-shell 中找到 pandas,但不能从 jupyter 中找到。
    【解决方案2】:

    当我们运行 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”。因此,在 numpy 版本中,pip3 解释的内容与 python/pyspark 解释的内容不匹配。

    修复它,

    第 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 集群

    【讨论】:

      猜你喜欢
      • 2016-09-27
      • 2020-07-24
      • 1970-01-01
      • 2016-01-03
      • 2015-09-08
      • 2017-02-04
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      相关资源
      最近更新 更多