当前位置: 首页 > 面试题库 >

羽毛和镶木地板有什么区别?

萧德馨
2023-03-14
问题内容

两者都是用于数据分析系统的 列式(磁盘)存储格式 。两者都集成在Apache
Arrow
(用于python的pyarrow软件包)中,并设计为与Arrow对应,作为列式内存分析层。

两种格式有何不同?

如果可能的话,在与熊猫一起工作时,您是否应该总是喜欢羽毛?

在哪些情况下羽毛比实木复合地板更合适,反之则更合适?

附录

我在这里https://github.com/wesm/feather/issues/188找到了一些提示,但是鉴于该项目的年龄很小,可能有点过时了。

这不是一个严格的速度测试,因为我只是转储并加载整个Dataframe,但是如果您以前从未听说过这些格式,则可以给您留下深刻的印象:

 # IPython    
import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.feather as feather
import pyarrow.parquet as pq
import fastparquet as fp


df = pd.DataFrame({'one': [-1, np.nan, 2.5],
                   'two': ['foo', 'bar', 'baz'],
                   'three': [True, False, True]})

print("pandas df to disk ####################################################")
print('example_feather:')
%timeit feather.write_feather(df, 'example_feather')
# 2.62 ms ± 35.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
print('example_parquet:')
%timeit pq.write_table(pa.Table.from_pandas(df), 'example.parquet')
# 3.19 ms ± 51 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
print()

print("for comparison:")
print('example_pickle:')
%timeit df.to_pickle('example_pickle')
# 2.75 ms ± 18.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
print('example_fp_parquet:')
%timeit fp.write('example_fp_parquet', df)
# 7.06 ms ± 205 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
print('example_hdf:')
%timeit df.to_hdf('example_hdf', 'key_to_store', mode='w', table=True)
# 24.6 ms ± 4.45 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
print()

print("pandas df from disk ##################################################")
print('example_feather:')
%timeit feather.read_feather('example_feather')
# 969 µs ± 1.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
print('example_parquet:')
%timeit pq.read_table('example.parquet').to_pandas()
# 1.9 ms ± 5.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

print("for comparison:")
print('example_pickle:')
%timeit pd.read_pickle('example_pickle')
# 1.07 ms ± 6.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
print('example_fp_parquet:')
%timeit fp.ParquetFile('example_fp_parquet').to_pandas()
# 4.53 ms ± 260 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
print('example_hdf:')
%timeit pd.read_hdf('example_hdf')
# 10 ms ± 43.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# pandas version: 0.22.0
# fastparquet version: 0.1.3
# numpy version: 1.13.3
# pandas version: 0.22.0
# pyarrow version: 0.8.0
# sys.version: 3.6.3
# example Dataframe taken from https://arrow.html" target="_blank">apache.org/docs/python/parquet.html

问题答案:
  • Parquet格式是为长期存储而设计的,其中Arrow更适合于短期或临时存储(在1.0.0版本发布后,Arrow可能更适合于长期存储,因为那时二进制格式将是稳定的)

  • Parquet比Feather更昂贵,因为它具有更多的编码和压缩层。羽毛是未修饰的原始柱状箭头记忆。将来我们可能会在Feather中添加简单的压缩。

  • 由于字典编码,RLE编码和数据页压缩,Parquet文件通常比Feather文件小得多。

  • Parquet是分析的一种标准存储格式,它受许多不同系统支持:Spark,Hive,Impala,各种AWS服务,将来由BigQuery等支持。因此,如果您要进行分析,Parquet是一个不错的选择,可以作为参考存储格式通过多个系统查询

由于您读取和写入的数据非常小,因此显示的基准非常嘈杂。您应该尝试压缩至少100MB或1GB以上的数据,以获得更多有用的基准,请参见例如http://wesmckinney.com/blog/python-
parquet-multithreading/

希望这可以帮助



 类似资料:
  • 我有一个数据帧,它是由运行特定日期的每日批处理创建的,然后保存在HDFS(Azure Data Lake Gen 2)中。 它是用这样的东西保存的 如您所见,我没有对数据帧进行分区,因为它只包含一个日期。 例如,第一天的第一个文件将存储在文件夹中 交易/2019/08/25 然后第二天,它就会在文件夹里 贸易/2019/08/26 问题是,当所有数据都放好后,日期上的过滤器谓词是否仍会被按下,HD

  • 很抱歉,我对Clojure不熟悉。到目前为止,我发现在Clojure世界中没有多少工具或教程是我能够消化的,所以我下载了Light Table(http://www.lighttable.com/)这听起来应该更容易。我使用的是64位Windows 7,基本的Light Table UI似乎可以正常工作。 为了进一步尝试使用Light Table/Clojure,我还下载了Clojure绘图库Qu

  • 我有一个avro格式的数据流(json编码),需要存储为镶木地板文件。我只能这样做, 把df写成拼花地板。 这里的模式是从json中推断出来的。但是我已经有了avsc文件,我不希望spark从json中推断出模式。 以上述方式,parquet文件将模式信息存储为StructType,而不是avro.record.type。是否也有存储avro模式信息的方法。 火花 - 1.4.1

  • 问题内容: 有没有办法从Java创建镶木地板文件? 我的内存中有数据(java类),我想将其写入一个Parquet文件中,以便以后从apache-drill中读取它。 有没有简单的方法可以做到这一点,例如将数据插入sql表? 得到它了 谢谢您的帮助。 结合答案和此链接,我能够创建一个实木复合地板文件并用钻头将其读回。 问题答案: 不建议使用ParquetWriter的构造函数(1.8.1),但不建

  • 有没有一种方法可以直接从基于avro模式的parquet文件在Amazon Athena中创建表?模式被编码到文件中,所以我需要自己实际创建DDL看起来很愚蠢。 我看到了这个,还有另一个复制品 但它们与Hive直接相关,这对雅典娜不起作用。理想情况下,我正在寻找一种以编程方式执行此操作的方法,而无需在控制台上定义它。

  • 我的 hdfs 中有 Parquet 文件。我想将这些镶木地板文件转换为csv格式