我正在尝试使用 awswrangler 将存储在 S3 中的任意大的镶木地板文件读入 pandas 数据帧,但由于文件的大小(以及我的带宽较差),我的查询仅限于前
N
行。
我不知道如何做到这一点,或者是否可以在不搬迁的情况下实现。
我可以使用
chunked=INTEGER
并在读取第一个块后中止吗?如果是这样怎么办?
我遇到过这个不完整的解决方案(最后 N 行;))使用 pyarrow - 读取 S3 parquet 表的最后 N 行 - 但是基于时间的过滤器对我来说并不理想,并且接受的解决方案甚至没有得到到故事的结尾(虽然很有帮助)。
或者有没有其他方法无需先下载文件(我现在可能已经完成了)?
谢谢!
您可以使用 awswrangler 使用 S3 Select 来完成此操作。例如:
import awswrangler as wr
df = wr.s3.select_query(
sql="SELECT * FROM s3object s limit 5",
path="s3://amazon-reviews-pds/parquet/product_category=Gift_Card/part-00000-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet",
input_serialization="Parquet",
input_serialization_params={},
use_threads=True,
)
仅从 S3 对象返回 5 行。
这对于其他读取方法是不可能的,因为在读取之前必须将整个对象拉到本地。使用 S3 select,过滤是在服务器端完成的
以防万一您在 s3 select 中遇到 OverMaxParquetBlockSize 错误..
我可以使用 chunked=INTEGER 并在读取第一个块后中止吗?如果是这样怎么办?
是的,您可以使用“return”或“raise StopIteration”(如果使用 Python 3.7 之前的版本)来终止生成器
例如:
dataframes = wr.s3.read_parquet(
path=file_path, chunked=5, boto3_session=boto3_session
)
chunk_counter = 0
for dataframe in dataframes:
if chunk_counter == 1:
return # Terminate the generator
chunk_counter = chunk_counter + 1
yield dataframe