Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用PyArrow从s3读取已定义的拼花文件列表?_Python_Parquet_Pyarrow - Fatal编程技术网

Python 如何使用PyArrow从s3读取已定义的拼花文件列表?

Python 如何使用PyArrow从s3读取已定义的拼花文件列表?,python,parquet,pyarrow,Python,Parquet,Pyarrow,我需要从存储在s3中的拼花地板文件中递增地将数据加载到Pandas,我尝试使用PyArrow来实现这一点,但没有任何运气 将拼花地板文件的整个目录写入Pandas很好: import s3fs import pyarrow.parquet as pq import pandas as pd fs = s3fs.S3FileSystem(mykey,mysecret) p_dataset = pq.ParquetDataset('s3://mys3bucket/directory', files

我需要从存储在s3中的拼花地板文件中递增地将数据加载到Pandas,我尝试使用PyArrow来实现这一点,但没有任何运气

将拼花地板文件的整个目录写入Pandas很好:

import s3fs
import pyarrow.parquet as pq
import pandas as pd

fs = s3fs.S3FileSystem(mykey,mysecret)
p_dataset = pq.ParquetDataset('s3://mys3bucket/directory', filesystem=fs)

df = p_dataset.read().to_pandas()
但是,当我尝试加载单个拼花地板文件时,我得到一个错误:

fs = s3fs.S3FileSystem(mykey,mysecret)
p_dataset = pq.ParquetDataset('s3://mys3bucket/directory/1_0_00000000000000014012'
, filesystem=fs)

df = p_dataset.read().to_pandas()
抛出错误:

    ---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-179-3d01b32c60f7> in <module>()
     15 p_dataset = pq.ParquetDataset(
     16     's3://mys3bucket/directory/1_0_00000000000000014012',
---> 17                       filesystem=fs)
     18 
     19 table2.to_pandas()

C:\User\Anaconda3\lib\site-packages\pyarrow\parquet.py in __init__(self, path_or_paths, filesystem, schema, metadata, split_row_groups, validate_schema, filters, metadata_nthreads)
    880 
    881         if validate_schema:
--> 882             self.validate_schemas()
    883 
    884         if filters is not None:

C:\User\Anaconda3\lib\site-packages\pyarrow\parquet.py in validate_schemas(self)
    893                 self.schema = self.common_metadata.schema
    894             else:
--> 895                 self.schema = self.pieces[0].get_metadata(open_file).schema
    896         elif self.schema is None:
    897             self.schema = self.metadata.schema

IndexError: list index out of range
---------------------------------------------------------------------------
索引器回溯(最后一次最近调用)
在()
15 p_数据集=pq.ParquetDataset(
16's3://mys3bucket/directory/1_0_u00000000000000014012',
--->17文件系统=fs)
18
19表2.to_pandas()
C:\User\Anaconda3\lib\site packages\pyarrow\parquet.py in\uuuuuuu init\uuuuuuu(self、路径或路径、文件系统、架构、元数据、拆分行组、验证架构、筛选器、元数据)
880
881如果验证_模式:
-->882 self.validate_schemas()
883
884如果过滤器不是无:
C:\User\Anaconda3\lib\site packages\pyarrow\parquet.py在validate\u模式中(self)
893 self.schema=self.common_metadata.schema
894其他:
-->895 self.schema=self.pieces[0]。获取\u元数据(打开\u文件)。架构
896 elif self.schema为无:
897 self.schema=self.metadata.schema
索引器:列表索引超出范围
如果您能帮助解决此错误,我们将不胜感激


理想情况下,我需要将添加到s3的所有新数据(自上次运行此脚本以来添加的)附加到Pandas数据帧,因此我认为我会将文件名列表传递给ParquetDataset。有没有更好的方法来实现这一点?谢谢

您想使用
pq.read\u table
(传递文件路径或文件句柄)而不是
pq.ParquetDataset
(传递目录)。HTH

对于python 3.6+AWS,有一个名为的库,它有助于Pandas/S3/Parquet之间的集成

安装do

pip install awswrangler
要使用awswrangler 1.x.x及更高版本从s3读取单个拼花地板文件,请执行以下操作:

import awswrangler as wr
df = wr.s3.read_parquet(path="s3://my_bucket/path/to/data_folder/my-file.parquet")
要阅读拼花地板文件列表,请执行以下操作:

import awswrangler as wr
df = wr.s3.read_parquet(path="s3://my_bucket/path/to/data_folder/", dataset=True)

通过设置dataset=True,awswrangler将读取s3键下的所有单个拼花地板文件。

请您显示现在包含的整个堆栈跟踪,谢谢。您好,我知道这种旧答案,但我不断收到read_table和ParquetDataset的“OSError:Passed non file path”错误。知道为什么吗?