pyspark 属性错误:无法在〈模块'pandas.core.internals. blocks'>上获取属性'new_block'

n6lpvg4x  于 2022-11-01  发布在  Spark
关注(0)|答案(7)|浏览(326)

我在AWS EMR上使用pyspark(4个r5.xlarge作为4个工作进程,每个进程有一个执行器和4个内核),得到了AttributeError: Can't get attribute 'new_block' on <module 'pandas.core.internals.blocks'。下面是抛出此错误的代码片段:

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")))

下面是回溯,其中get_zip_b中的第102行引用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好像是司机和工人的Pandas版本不匹配造成的?
2,但是我在两个不同的数据集上运行了同样的代码,一个没有错误,另一个没有,这看起来很奇怪,也不确定,而且看起来错误可能不是Pandas版本不匹配造成的,否则两个数据集都不会成功。
3,然后我再次在成功的数据集上运行相同的代码,但这一次使用了不同的Spark配置:将spark.driver.memory从2048M设置为4192M,并抛出了属性错误。
4、综上所述,我认为AttributeError与驱动程序有关,但从错误信息中看不出它们之间的关系,也看不出修复方法:属性错误:无法在〈模块'pandas.core.internals. blocks'上获取属性'new_block'。

14ifxucb

14ifxucb1#

溶液

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

或者

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

简而言之
你的Pandas版本用来倾倒泡菜(dump_version,可能是1.3.x)与用于加载pickle的panda版本不兼容(load_version,可能是1.2.x)。要解决此问题,试着升级Pandas版(load_version)到1.3.x,然后加载pickle。或者降级panda版本(dump_version)到1.2.x,然后重新转储一个新的pickle。在这之后,您可以用1.2.x版本的panda加载新的pickle。
这和PySpark无关
长输入
此问题与Pandas版本1.2.x1.3.x之间的向后不兼容有关。在1.2.5及之前的版本中,Pandas在模块pandas.core.internals.blocks cf源代码v1.2.5中使用变量名new_blocks。2021年7月2日,Pandas发布了1.3.0版本。在此次更新中,Pandas更改了api,pandas.core.internals.blocks模块中的变量名new_blocks已更改为new_block cf源代码v1.3.0。
API的此更改将导致两个不兼容错误:

  • 如果你已经用Pandas v1.3.x转储了一个pickle,然后你试图用Pandas v1.2.x加载这个pickle,你会得到下面的错误:

AttributeError: Can't get attribute 'new_block' on <module 'pandas.core.internals.blocks' from '.../site-packages/pandas/core/internals/blocks.py'>'>
Python抛出这个错误,抱怨它在当前的pandas.core.internals.blocks上找不到属性new_block,因为为了pickle加载一个对象,它必须使用与转储pickle完全相同的类。

这正是您的案例:已经倾倒了pickle与Pandasv1.3.x和尝试加载pickle与Pandasv1.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'>
bvn4nwqk

bvn4nwqk2#

我在服务器上使用panda 1.3.2,而在我的客户机上使用1.2时也出现了同样的错误。将panda降级到1.2解决了这个问题。

hujrc8aj

hujrc8aj3#

我在以下情况下遇到了相同的AttributeError:

  • Pickle文件是在Windows机器上使用Pandas 1.4.0和Python 3.8创建的
  • 我尝试在Debian机器上使用Pandas 1.3.5,Python 3.7加载文件
arknldoa

arknldoa4#

pip安装--升级--用户pandas==1.3(+重新启动)

tktrz96b

tktrz96b5#

如果您有一个大型模型对象并且无法更改环境,则可使用替代绕过建议:只需将DataFrame对象导出为另一种文件类型(如. csv)。

axr492tv

axr492tv6#

我也有同样的问题。如果你使用Spyder,试试Jupyter笔记本。我在Spyder中也有同样的错误,但在Jupyter笔记本中它起作用了。
只是重新启动spyder就解决了我的问题!

dy2hfwbg

dy2hfwbg7#

我在使用Pandas1. 3. 2时也遇到了同样的错误。安装了conda install matplotlib=1.4.3解决了这个问题。感谢其他帖子的指点。

相关问题