经过一番搜索,我未能找到fastparquet
和的彻底比较pyarrow
。
我找到了这篇博文(速度的基本比较)。
和一个 github讨论,声称使用创建的文件fastparquet
不支持 AWS-athena(顺便说一句,情况仍然如此吗?)
我何时/为什么要使用其中一个?主要优点和缺点是什么?
我的具体用例是处理数据并将dask
其写入 s3,然后使用 AWS-athena 读取/分析它。
我使用 fastparquet 和 pyarrow 将 protobuf 数据转换为 parquet 并使用 Athena 在 S3 中查询相同的数据。然而,在我的用例中,两者都有效,它是一个 lambda 函数,压缩包文件必须是轻量级的,所以继续使用 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 docs)。
我要指出的是速度比较的作者也是 pyarrow 的作者 :) 我可以谈谈 fastparquet 案例。
从您的角度来看,最重要的是要了解兼容性。Athena 不是 fastparquet(或 pyarrow)的测试目标之一,因此您应该在做出选择之前彻底测试。您可能想要为日期时间表示、空值、类型调用 ( docs ) 的许多选项,这些选项可能对您很重要。
使用 dask 写入 s3 肯定是 fastparquet 的一个测试用例,我相信 pyarrow 也应该没有问题。
我刚刚使用 fastparquet 从 Elasticsearch 中获取数据并将其存储在 S3 中并使用 Athena 进行查询,完全没有问题。
我使用以下内容将 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 阅读更加幸运。