【问题标题】:AttributeError: Can't get attribute 'new_block' on <module 'pandas.core.internals.blocks'>AttributeError:无法在 <module 'pandas.core.internals.blocks'> 上获取属性 'new_block'
【发布时间】:2021-10-08 01:15:23
【问题描述】:

我在 AWS EMR 上使用 pyspark(4 个 r5.xlarge 作为 4 个工作人员,每个工作人员有一个执行程序和 4 个核心),我得到了AttributeError: Can't get attribute 'new_block' on &lt;module 'pandas.core.internals.blocks'。以下是引发此错误的代码的 sn-p:

search =  SearchEngine(db_file_dir = "/tmp/db")
conn = sqlite3.connect("/tmp/db/simple_db.sqlite")
pdf_ = pd.read_sql_query('''select  zipcode, lat, lng, 
                        bounds_west, bounds_east, bounds_north, bounds_south from 
                        simple_zipcode''',conn)
brd_pdf = spark.sparkContext.broadcast(pdf_) 
conn.close()


@udf('string')
def get_zip_b(lat, lng):
    pdf = brd_pdf.value 
    out = pdf[(np.array(pdf["bounds_north"]) >= lat) & 
              (np.array(pdf["bounds_south"]) <= lat) & 
              (np.array(pdf['bounds_west']) <= lng) & 
              (np.array(pdf['bounds_east']) >= lng) ]
    if len(out):
        min_index = np.argmin( (np.array(out["lat"]) - lat)**2 + (np.array(out["lng"]) - lng)**2)
        zip_ = str(out["zipcode"].iloc[min_index])
    else:
        zip_ = 'bad'
    return zip_

df = df.withColumn('zipcode', get_zip_b(col("latitude"),col("longitude")))

下面是回溯,其中第 102 行,在 get_zip_b 中指的是pdf = brd_pdf.value

21/08/02 06:18:19 WARN TaskSetManager: Lost task 12.0 in stage 7.0 (TID 1814, ip-10-22-17-94.pclc0.merkle.local, executor 6): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/mnt/yarn/usercache/hadoop/appcache/application_1627867699893_0001/container_1627867699893_0001_01_000009/pyspark.zip/pyspark/worker.py", line 605, in main
    process()
  File "/mnt/yarn/usercache/hadoop/appcache/application_1627867699893_0001/container_1627867699893_0001_01_000009/pyspark.zip/pyspark/worker.py", line 597, in process
    serializer.dump_stream(out_iter, outfile)
  File "/mnt/yarn/usercache/hadoop/appcache/application_1627867699893_0001/container_1627867699893_0001_01_000009/pyspark.zip/pyspark/serializers.py", line 223, in dump_stream
    self.serializer.dump_stream(self._batched(iterator), stream)
  File "/mnt/yarn/usercache/hadoop/appcache/application_1627867699893_0001/container_1627867699893_0001_01_000009/pyspark.zip/pyspark/serializers.py", line 141, in dump_stream
    for obj in iterator:
  File "/mnt/yarn/usercache/hadoop/appcache/application_1627867699893_0001/container_1627867699893_0001_01_000009/pyspark.zip/pyspark/serializers.py", line 212, in _batched
    for item in iterator:
  File "/mnt/yarn/usercache/hadoop/appcache/application_1627867699893_0001/container_1627867699893_0001_01_000009/pyspark.zip/pyspark/worker.py", line 450, in mapper
    result = tuple(f(*[a[o] for o in arg_offsets]) for (arg_offsets, f) in udfs)
  File "/mnt/yarn/usercache/hadoop/appcache/application_1627867699893_0001/container_1627867699893_0001_01_000009/pyspark.zip/pyspark/worker.py", line 450, in <genexpr>
    result = tuple(f(*[a[o] for o in arg_offsets]) for (arg_offsets, f) in udfs)
  File "/mnt/yarn/usercache/hadoop/appcache/application_1627867699893_0001/container_1627867699893_0001_01_000009/pyspark.zip/pyspark/worker.py", line 90, in <lambda>
    return lambda *a: f(*a)
  File "/mnt/yarn/usercache/hadoop/appcache/application_1627867699893_0001/container_1627867699893_0001_01_000009/pyspark.zip/pyspark/util.py", line 121, in wrapper
    return f(*args, **kwargs)
  File "/mnt/var/lib/hadoop/steps/s-1IBFS0SYWA19Z/Mobile_ID_process_center.py", line 102, in get_zip_b
  File "/mnt/yarn/usercache/hadoop/appcache/application_1627867699893_0001/container_1627867699893_0001_01_000009/pyspark.zip/pyspark/broadcast.py", line 146, in value
    self._value = self.load_from_path(self._path)
  File "/mnt/yarn/usercache/hadoop/appcache/application_1627867699893_0001/container_1627867699893_0001_01_000009/pyspark.zip/pyspark/broadcast.py", line 123, in load_from_path
    return self.load(f)
  File "/mnt/yarn/usercache/hadoop/appcache/application_1627867699893_0001/container_1627867699893_0001_01_000009/pyspark.zip/pyspark/broadcast.py", line 129, in load
    return pickle.load(file)
AttributeError: Can't get attribute 'new_block' on <module 'pandas.core.internals.blocks' from '/mnt/miniconda/lib/python3.9/site-packages/pandas/core/internals/blocks.py'>

一些观察和思考过程:

1、网上搜索了一下,pyspark的AttributeError好像是driver和worker的pandas版本不匹配造成的?

2,但是我在两个不同的数据集上运行了相同的代码,一个工作没有任何错误,另一个没有,这看起来很奇怪和不确定,而且看起来错误可能不是由不匹配的 pandas 版本引起的。否则,两个数据集都不会成功。

3,然后我再次在成功的数据集上运行相同的代码,但这次使用不同的 spark 配置:将 spark.driver.memory 从 2048M 设置为 4192m,并抛出 AttributeError。

4,总而言之,我认为AttributeError与驱动程序有关。但我无法判断它们与错误消息的关系以及如何修复它:AttributeError: Can't get attribute 'new_block' on

【问题讨论】:

  • 当您使用协议 = 4 在 pandas 1.3.2 上保存 pickle 文件并尝试在 pandas 1.2 上打开相同的 pickle 文件时,会出现相同的错误。截至今天,我没有找到其他地方,但这里说的是这个问题。

标签: python pandas apache-spark pyspark attributeerror


【解决方案1】:

解决方案

  • 保持pickle文件不变,升级你的pandas版本到1.3.x,然后加载pickle文件。

或者

  • 保持当前 pandas 版本不变,降级转储方面将 pandas 版本降级到 1.2.x,然后使用 v1.dump 转储一个新的 pickle 文件。 2.x。使用 1.2.x 版本的 pandas 将其加载到您身边

总之

您用于转储 pickle 的 pandas 版本(dump_version,可能是 1.3.x)与您用于加载 pickle 的 pandas 版本不兼容(load_version,可能1.2.x)。为了解决这个问题,尝试在加载环境中将pandas版本(load_version)升级到1.3.x,然后再加载pickle。或者将 pandas 版本(dump_version)降级到 1.2.x,然后重新转储一个新的 pickle。在此之后,您可以使用 1.2.x 版的 pandas 加载新的泡菜

这与 PySpark 无关

长篇

此问题与 Pandas 版本 1.2.x1.3.x 之间的向后不兼容有关。在1.2.5 及之前的版本中,Pandas 在模块pandas.core.internals.blocks 中使用变量名new_blocks cf source code v1.2.5。 2021 年 7 月 2 日,Pandas 发布版本1.3.0。在本次更新中,Pandas 更改了 api,模块 pandas.core.internals.blocks 中的变量名 new_blocks 已更改为 new_block cf source code v1.3.0

此 API 更改将导致两个不兼容错误:

  • 如果您使用 Pandas v1.3.x 转储了 pickle,并尝试使用 Pandas v1.2.x 加载 pickle,您将收到以下错误:

AttributeError: Can't get attribute 'new_block' on &lt;module 'pandas.core.internals.blocks' from '.../site-packages/pandas/core/internals/blocks.py'&gt;'&gt;

Python 抛出此错误,抱怨它无法在您当前的 pandas.core.internals.blocks 上找到属性 new_block,因为为了腌制加载对象,它必须使用用于转储腌制的完全相同的类。

这正是你的情况:用 Pandas v1.3.x 倾倒了泡菜并尝试用 Pandas v1.2.x 加载泡菜

重现错误

pip install --upgrade pandas==1.3.4

import numpy as np 
import pandas as pd
df =pd.DataFrame(np.random.rand(3,6))

with open("dump_from_v1.3.4.pickle", "wb") as f: 
    pickle.dump(df, f) 

quit()

pip install --upgrade pandas==1.2.5

import pickle

with open("dump_from_v1.3.4.pickle", "rb") as f: 
    df = pickle.load(f) 


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-2-ff5c218eca92> in <module>
      1 with open("dump_from_v1.3.4.pickle", "rb") as f:
----> 2     df = pickle.load(f)
      3 

AttributeError: Can't get attribute 'new_block' on <module 'pandas.core.internals.blocks' from '/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/blocks.py'>

【讨论】:

    【解决方案2】:

    我在服务器中使用 pandas 1.3.2 而在我的客户端中使用 1.2 时遇到了同样的错误。 将 pandas 降级到 1.2 解决了这个问题。

    【讨论】:

      【解决方案3】:

      pip install --upgrade --user pandas==1.3 (+重启)

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题。如果你使用 spyder,试试 jupyter notebooks。我在 spyder 中遇到了同样的错误,但在 jupyter 笔记本中它起作用了。

        重启 spyder 解决了我的问题!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-09
          • 2023-02-10
          • 2022-06-20
          • 1970-01-01
          • 2022-12-07
          相关资源
          最近更新 更多