পালক এবং parquet মধ্যে পার্থক্য কি?


95

উভয়ই ডেটা বিশ্লেষণ সিস্টেমে ব্যবহারের জন্য কলামার (ডিস্ক-) স্টোরেজ ফর্ম্যাট । উভয়ই অ্যাপাচি অ্যারো ( পাইথনের জন্য পাইররো প্যাকেজ) এর মধ্যে একীভূত এবং মেমোরি বিশ্লেষণ স্তরটি কলামার হিসাবে অ্যারোর সাথে মিলিয়ে ডিজাইন করা হয়েছে ।

উভয় ফর্ম্যাট কিভাবে পৃথক হয়?

সম্ভব হলে পান্ডার সাথে কাজ করার সময় আপনার কি সবসময় পালক পছন্দ করা উচিত?

ব্যবহারের ক্ষেত্রে কী কী ক্ষেত্রে পালকগুলি পারকোয়েট এবং অন্য উপায়ে রাউন্ডের চেয়ে বেশি উপযুক্ত ?


পরিশিষ্ট

আমি https://github.com/wesm/feather/issues/188 এখানে কিছু ইঙ্গিত পেয়েছি , কিন্তু এই প্রকল্পের তরুণ বয়সটি দেওয়া হলেও সম্ভবত এটি কিছুটা পুরানো।

কোনও গুরুতর গতির পরীক্ষা নয় কারণ আমি কেবল একটি পুরো ডেটাফ্রেম ডাম্পিং এবং লোড করছি তবে আপনি যদি ফর্ম্যাটগুলি আগে কখনও না শুনে থাকেন তবে আপনাকে কিছুটা ধারণা দেওয়ার জন্য:

 # 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.apache.org/docs/python/parquet.html

উত্তর:


136
  • পরকীয়া বিন্যাসটি দীর্ঘমেয়াদী স্টোরেজের জন্য ডিজাইন করা হয়েছে, যেখানে অ্যারো স্বল্প মেয়াদী বা ইফেমেরাল স্টোরেজের জন্য বেশি লক্ষ্যযুক্ত (তীর দীর্ঘমেয়াদী স্টোরেজের জন্য 1.0.0 রিলিজ হওয়ার পরে আরও উপযুক্ত হতে পারে, যেহেতু বাইনারি ফর্ম্যাটটি তখন স্থিতিশীল থাকবে)

  • পারকুইটটি ফেদারের চেয়ে লেখার চেয়ে বেশি ব্যয়বহুল কারণ এটিতে এনকোডিং এবং সংকোচনের আরও স্তর রয়েছে। পালকটি অশোধিত কাঁচা কলামের তীর মেমরি is আমরা সম্ভবত ভবিষ্যতে ফেদারে সাধারণ সংক্ষেপণ যুক্ত করব।

  • অভিধান এনকোডিং, আরএলই এনকোডিং এবং ডেটা পৃষ্ঠা সংক্ষেপণের কারণে পারকুইট ফাইলগুলি প্রায়শই ফেদার ফাইলগুলির চেয়ে অনেক ছোট হবে

  • Parquet বিশ্লেষণের জন্য স্ট্যান্ডার্ড স্টোরেজ ফর্ম্যাট যা অনেকগুলি বিভিন্ন সিস্টেম দ্বারা সমর্থিত: স্পার্ক, মধু, ইম্পালা, বিভিন্ন AWS পরিষেবাদি, ভবিষ্যতে বিগকুয়েরি দ্বারা ইত্যাদি So সুতরাং আপনি যদি বিশ্লেষণগুলি করেন তবে পারকুইট রেফারেন্স স্টোরেজ ফর্ম্যাট হিসাবে একটি ভাল বিকল্প একাধিক সিস্টেম দ্বারা ক্যোয়ারী

আপনি যে বেঞ্চমার্কগুলি দেখিয়েছেন তা খুব শোরগোলের হতে চলেছে যেহেতু আপনি পড়েছেন এবং লিখেছেন সেগুলি খুব ছোট। আরও কিছু তথ্যবহুল বেঞ্চমার্ক পেতে আপনার কমপক্ষে 100MB বা উপরে 1GB তথ্য সংকোচনের চেষ্টা করা উচিত, দেখুন http://wesmckinney.com/blog/python-parquet-multithreading/

আশাকরি এটা সাহায্য করবে


4
হ্যাঁ, "সঙ্কুচিত" সর্বদা একটি বিকল্প হতে পারে
ওয়েজ ম্যাককিনে

4
আমি লক্ষ্য করেছি যে generate_floatsএখানে আপনার বেঞ্চমার্ক কোডে আপনার ফাংশনটি wesmckinney.com/blog/python-parquet-update গ্যারান্টি দেয় না unique_values। তারা কেবল এলোমেলো। এন = 100 এম দিয়ে আমি দশ রানের মধ্যে দু'টি নকল পেয়েছি। কেউ এই ফাংশনটি ব্যবহার করে যেখানে স্বতন্ত্রতার গ্যারান্টি দেওয়া উচিত কেবল সেই ক্ষেত্রে উল্লেখ করা।
ডারকনৌট

4
@ ডারকোনাট কেবল ভাবছেন ... সংক্ষেপণের ফলে আরও ছোট আকারের ফলস্বরূপ এটি এটিকে মেমোরিতে পড়তে তত দ্রুত হবে। এটি হতে পারে যে কমপ্রেসিং / ডিকম্প্রেসিংয়ের কারণে অতিরিক্ত প্রসেসিং আরও বাইটগুলি পড়ার চেয়ে আরও দ্রুত হবে। বা আপনার কি এমন পরিস্থিতি আছে যা আমি ভাবছি না?
পাসক্যালভিকুটেন

4
এইচডিএফ 5 আরও সাধারণ এবং ভারী ... বেশিরভাগ সময় বেশ ধীর।
আইভো ওয়েলেচ

4
@ ওয়েসএমসিকি্নি আমি লক্ষ্য করেছি যে আপনার উত্তরটি 2018 সালে ফিরে লেখা হয়েছিল 2..৩ বছর পরে, আপনি কি এখনও মনে করেন যে অ্যারো (পালক) দীর্ঘমেয়াদী স্টোরেজ (পারকুইটের সাথে তুলনা করে) ভাল নয়? একটি নির্দিষ্ট কারণ আছে? স্থিতিশীলতার মতো? ফর্ম্যাট বিবর্তন? বা?
এইচসিএসএফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.