经过一番搜索,我未能找到
fastparquet
和pyarrow
的彻底比较。
我找到了这个博客post(速度的基本比较)。
还有一个 github 讨论,声称使用
fastparquet
创建的文件不支持 AWS-athena(顺便说一句,情况仍然如此吗?)
我何时/为什么要使用其中一种而不是另一种?主要优点和缺点是什么?
dask
处理数据,将其写入 s3,然后使用 AWS-athena 读取/分析它。
我使用 fastparquet 和 pyarrow 将 protobuf 数据转换为 parquet,并使用 Athena 在 S3 中查询相同数据。然而,在我的用例中,两者都有效,这是一个 lambda 函数,包 zip 文件必须是轻量级的,所以继续使用 fastparquet。 (fastparquet 库只有约 1.1mb,而 pyarrow 库为 176mb,Lambda 包限制为 250mb)。
我使用以下内容将数据框存储为镶木地板文件:
from fastparquet import write
parquet_file = path.join(filename + '.parq')
write(parquet_file, df_data)
但是,由于问题缺乏具体标准,而我来这里是为了一个好的“默认选择”,我想声明 DataFrame 对象的 pandas 默认引擎 是 pyarrow(请参阅 pandas 文档)。
从您的角度来看,最重要的是要了解兼容性。 Athena 不是 fastparquet(或 pyarrow)的测试目标之一,因此您应该在做出选择之前进行彻底测试。您可能需要为日期时间表示、空值、类型调用许多选项(
docs),这些选项对您可能很重要。
使用 dask 写入 s3 无疑是 fastparquet 的一个测试用例,我相信 pyarrow 也应该没有问题。
我使用以下命令将数据帧作为 parquet 文件存储在 S3 中:
import s3fs
import fastparquet as fp
import pandas as pd
import numpy as np
s3 = s3fs.S3FileSystem()
myopen = s3.open
s3bucket = 'mydata-aws-bucket/'
# random dataframe for demo
df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
parqKey = s3bucket + "datafile" + ".parq.snappy"
fp.write(parqKey, df ,compression='SNAPPY', open_with=myopen)
我的桌子在 Athena 中看起来类似:
CREATE EXTERNAL TABLE IF NOT EXISTS myanalytics_parquet (
`column1` string,
`column2` int,
`column3` DOUBLE,
`column4` int,
`column5` string
)
STORED AS PARQUET
LOCATION 's3://mydata-aws-bucket/'
tblproperties ("parquet.compress"="SNAPPY")
https://wesmckinney.com/blog/python-parquet-update/。根据它的说法,pyarrow 比 fastparquet 更快,难怪它是 dask 中使用的默认引擎。
更新:我之前的回复的更新。我更幸运的是在谷歌云存储中使用 pyarrow 写作并使用 fastparquet 阅读。