首页 > 解决方案 > pandas.read_parquet 在分区 spark 表上抛出 ArrowIOError

问题描述

我遇到了一个奇怪的问题,我认为这可能是 spark 和/或 pandas 中的错误,但我不确定这是否可能是我的用户错误。它类似于此已解决问题相关的此错误,但并不完全相同。

长话短说,我有一个包含四列的 pyspark 数据框,其中第四列是一个很长的字符串(实际上是一个键/值对列表,我稍后将对其进行解包,但将它们存储为字符串更有效这部分过程)。当我这样做时,df.print_schema()我会看到:

root
 |-- attribute: string (nullable = true)
 |-- id: long (nullable = true)
 |-- label: long (nullable = true)
 |-- featureString: string (nullable = true)

我的目标是将其写入一个表(默认情况下在我的集群上)作为镶木地板存储在 s3 中。然后,我稍后将在单独的服务器上将每个单独的镶木地板读入 python pd.read_parquet

所以,当我运行时:

df.select('attribute','id', 'label', 'featureString')\
    .write.saveAsTable('db_name.table_name1', mode='overwrite')

然后我可以pd.read_parquet()对 s3 中的单个文件进行操作,并且效果很好。但是,我实际上希望每个文件都是列的给定值的所有行attribute,所以我这样做:

df.select('attribute','id', 'label', 'featureString')\
    .repartition('attribute')\
    .write.saveAsTable('db_name.table_name2', mode='overwrite')

但是当我尝试读取其中的一些(但不是全部)文件时,pd.read_parquet我得到ArrowIOError: Invalid parquet file. Corrupt footer.了我上面链接的问题的确切错误。

似乎更大的分区(约 4 GB 左右)无法读回,这也与该问题相似(仅适用于大文件)。但是,那个问题是关于读回已经用pd.to_parquet()pysparkwrite().saveAsTable()命令写入的文件。

无论如何,我对此感到困惑。任何帮助将非常感激。

PS-我在 python 3.6 中使用 spark 2.3 和 pandas 0.23

标签: python-3.xpandasapache-sparkpyspark

解决方案


推荐阅读