یہ کنورٹر کیا کرتا ہے
Apache Parquet وہی فارمیٹ ہے جو آج کل تقریباً ہر ڈیٹا پائپ لائن لکھتی ہے: کالم کی بنیاد پر، دبایا ہوا، بائنری، اور تجزیاتی انجنوں کے لیے بنایا گیا۔ مشین کے لیے بہترین، انسانی آنکھ کے لیے بےکار۔ نہ اسے ٹیکسٹ ایڈیٹر میں کھولا جا سکتا ہے، نہ اُس ساتھی کو بھیجا جا سکتا ہے جو سارا دن اسپریڈ شیٹ میں رہتا ہے، نہ کسی ٹکٹ میں چسپاں کیا جا سکتا ہے۔ CSV اس کا الٹ ہے: تجزیے کے لیے بھونڈا، مگر ہر جگہ پڑھنے کے قابل۔
یہ صفحہ دونوں سروں کو سب سے سیدھے طریقے سے جوڑتا ہے۔ آپ ڈسک سے ایک .parquet فائل منتخب کرتے ہیں، صفحہ اسے کھولتا ہے، بتاتا ہے کہ کتنی سطریں اور کتنے کالم ملے، ایک جھلک دکھاتا ہے، اور ڈاؤن لوڈ کے لیے CSV تیار کر دیتا ہے۔ نہ اکاؤنٹ، نہ قطار، نہ اپ لوڈ کی پٹی — کیونکہ اس سارے عمل میں کوئی سرور شامل ہی نہیں ہوتا۔
یہی آخری بات اس ٹول کے وجود کی وجہ ہے۔ زیادہ تر آن لائن Parquet کنورٹر دراصل ایک فارم ہوتے ہیں جو آپ کی فائل کسی بیک اینڈ کو بھیج دیتا ہے۔ اگر فائل میں گاہکوں کا ریکارڈ، تنخواہیں، مریضوں کے شناختی نمبر یا ڈیٹا پالیسی کے دائرے میں آنے والی کوئی چیز ہے، تو وہی بھیجنا اصل مسئلہ ہے۔ یہاں تبدیلی آپ کے ٹیب میں چلنے والا JavaScript ہے، جو انہی بائٹس کو پڑھتا ہے جو فائل منتخب کرتے ہی براؤزر نے صفحے کے حوالے کر دی تھیں۔
چار مرحلوں میں استعمال
- فائل کے خانے میں اپنی
.parquetفائل منتخب کریں۔ اس سے پہلے کچھ نہیں ہوتا۔ - علیحدہ کرنے والا نشان چنیں۔ کاما طےشدہ ہے؛ سیمی کولن اُن اسپریڈ شیٹس کے لیے مناسب ہے جہاں کاما اعشاریہ کا نشان ہے؛ ٹیب سے بننے والی TSV زیادہ تر اسپریڈ شیٹ پروگراموں میں صاف چسپاں ہوتی ہے۔
- طے کریں کہ پہلی سطر میں کالموں کے نام ہوں یا نہ ہوں۔ ہیڈر کا خانہ پہلے سے فعال ہے، اور اسے بدلتے ہی نتیجہ فوراً نئے سرے سے بنتا ہے، فائل دوبارہ پڑھے بغیر۔
- جھلک دیکھیں اور CSV ڈاؤن لوڈ کریں دبائیں۔ صفحہ ہلکا رکھنے کے لیے جھلک میں پہلی 200 سطریں دکھائی جاتی ہیں؛ ڈاؤن لوڈ کی گئی فائل میں Parquet کی تمام سطریں ہوتی ہیں۔
تبدیلی کے بعد علیحدہ کرنے والا نشان یا ہیڈر بدلنے پر فائل دوبارہ ڈسک سے نہیں پڑھی جاتی۔ کھولی ہوئی ٹیبل ٹیب کی یادداشت میں رہتی ہے، اس لیے لاکھوں سطروں پر بھی یہ تبدیلیاں فوری ہوتی ہیں۔
Parquet ٹیبل کیسے رکھتا ہے، اور تبدیلی آسان کیوں نہیں
CSV سطروں کا ایک بہاؤ ہے۔ Parquet اس کا الٹ کرتا ہے: وہ ہر کالم الگ رکھتا ہے، row group کہلانے والے بلاکوں میں، اور ایک row group کے اندر کالم کئی صفحات سے بنے chunk میں رہتا ہے۔ ہر صفحہ دبایا جا سکتا ہے، اور اس کے اندر کی قدریں کئی مختلف طریقوں سے انکوڈ ہو سکتی ہیں۔
اس لیے اسے پڑھنے کا مطلب کئی تہیں کھولنا ہے:
- فوٹر میں schema اور ہر chunk کا مقام ہوتا ہے، جو Thrift کے کومپیکٹ پروٹوکول میں لکھا جاتا ہے۔ فائل چار بائٹ کی لمبائی اور ASCII نشان
PAR1پر ختم ہوتی ہے، اور یہی نشان فائل کے آغاز میں بھی ہوتا ہے۔ کوئی نشان غائب ہو تو یا وہ Parquet نہیں، یا کسی نقل کے دوران ادھوری رہ گئی۔ - ہر صفحہ دبایا ہوا ہو سکتا ہے۔ یہ ٹول بغیر کمپریشن، Snappy اور Gzip صفحات کھولتا ہے، جو مل کر pandas، PyArrow، Polars، DuckDB اور Spark سے لکھی گئی فائلوں کی بھاری اکثریت کا احاطہ کرتے ہیں۔
- صفحے کے اندر قدریں انکوڈ شدہ ہوتی ہیں۔ سادہ ترتیب، ڈکشنری، run-length، delta خاندان اور byte-stream-split سب سنبھالے جاتے ہیں، ڈیٹا پیج v1 اور نئے v2 دونوں میں۔
- خالی قدریں قدر کے طور پر محفوظ نہیں ہوتیں۔ Parquet ہر سطر کے لیے ایک definition level لکھتا ہے، اور کنورٹر انہی سطحوں سے قدروں کو درست سطر میں واپس رکھتا ہے اور خالی جگہیں خالی چھوڑ دیتا ہے۔
جب سب ٹھیک چل رہا ہو تو ان تفصیلات کی اہمیت نہیں؛ اہمیت تب ہے جب کچھ بگڑے۔ چونکہ ڈی کوڈر ہر تہہ سمجھتا ہے، اس لیے غیر معاون فائل پر وہ کمپریشن، انکوڈنگ یا nesting کے بارے میں واضح پیغام دیتا ہے، خاموشی سے بگڑی ہوئی CSV نہیں۔
حل شدہ مثال: کون سی قدریں نظر آئیں گی
Parquet کی تین اقسام کا CSV میں سیدھا متبادل نہیں، اس لیے جان لینا بہتر ہے کہ لکھا کیا جاتا ہے۔
تاریخ کا کالم۔ DATE قسم یکم جنوری 1970 سے گنے گئے دنوں کا 32 بٹ شمار رکھتی ہے۔ اگر محفوظ عدد 19723 ہے، تو عہد کے 19723 دن بعد یکم جنوری 2024 آتا ہے، اور CSV کا خانہ 2024-01-01 لکھا جاتا ہے۔ کوئی ٹائم زون لاگو نہیں ہوتا، کیونکہ تاریخ میں سرکانے کے لیے کوئی وقت ہوتا ہی نہیں۔
مائیکرو سیکنڈ ٹائم اسٹیمپ۔ مائیکرو سیکنڈ درستی والا TIMESTAMP کالم عہد سے گنے مائیکرو سیکنڈوں کا 64 بٹ شمار رکھتا ہے۔ قدر 1704112215123456 لیجیے۔ اسے 1,000,000 پر تقسیم کریں تو 1704112215 پورے سیکنڈ بچتے ہیں، یعنی یکم جنوری 2024، 12:30:15 UTC، اور 123456 مائیکرو سیکنڈ باقی رہ جاتے ہیں۔ خانہ 2024-01-01 12:30:15.123456 لکھا جاتا ہے۔ اعشاریے کے آخری صفر کاٹ دیے جاتے ہیں، چنانچہ ٹھیک سیکنڈ پر آنے والا ٹائم اسٹیمپ بغیر اعشاریہ حصے کے لکھا جاتا ہے۔
decimal کالم۔ DECIMAL(12,2) کالم ایک صحیح عدد اور ایک scale کی صورت میں رکھا جاتا ہے۔ عدد 1230 اور scale 2 کا مطلب 12.30 ہے، اور بالکل یہی 12.30 لکھا جاتا ہے۔ یہی وجہ ہے کہ مالیاتی کالم کو کبھی float سے نہیں گزارنا چاہیے: متن درست قدر بھی محفوظ رکھتا ہے اور schema کے وعدہ کردہ اعشاریہ خانے بھی۔
بولین true اور false لکھے جاتے ہیں، خالی قدریں خالی خانے بن جاتی ہیں، اور جو بائنری کالم درست UTF-8 نہیں وہ base64 میں لکھے جاتے ہیں تاکہ خام بائٹس CSV کی ساخت نہ توڑ دیں۔
آف لائن کنورٹر کہاں کام آتا ہے
سب سے واضح صورت رازداری ہے: صارفین کے ریکارڈ کا ایک برآمد، جسے کسی مشترکہ ڈرائیو کے قریب جانے سے پہلے آپ ایک نظر دیکھنا چاہتے ہیں۔ کچھ بھی لیپ ٹاپ سے باہر نہیں جاتا، اس لیے کوئی پالیسی موڑنی نہیں پڑتی۔
دوسری صورت جھنجھٹ کی ہے۔ ساتھی نے Parquet برآمد بھیجا، آپ کو تین کالم جانچنے ہیں، اور پانچ منٹ بعد مٹا دی جانے والی فائل کے لیے Python اور PyArrow نصب کرنا بےتکی قیمت ہے۔ ایک ٹیب کھولنا نہیں۔
تیسری صورت وہ مشین ہے جسے ترتیب دینے کا اختیار آپ کے پاس نہیں: مقفل دفتری لیپ ٹاپ، گاہک کا کمپیوٹر، لیب کی مشین جہاں پیکیج نہیں چڑھتے۔ براؤزر وہاں پہلے سے موجود ہے۔
چوتھی صورت تدریس ہے۔ ایک ہی ٹیبل کو پہلے دھندلے بائنری ٹکڑے اور پھر سادہ متن کی شکل میں دیکھنا کالم بمقابلہ سطر پر مبنی ذخیرے کا فرق اتنا ٹھوس بنا دیتا ہے جتنا کوئی خاکہ شاذ ہی کر پاتا ہے۔
عام غلطیاں اور ان سے بچاؤ
اسپریڈ شیٹ میں CSV کھولنے پر ایک ہی بڑا کالم نظر آنا۔ آپ کا پروگرام اپنی زبان کی ترتیب والا نشان چاہتا ہے۔ سیمی کولن کے اختیار سے فائل دوبارہ بنائیں، یا امپورٹ ڈائیلاگ میں نشان واضح طور پر بتائیں۔
لمبے عددی شناختی نمبروں کا سائنسی نوٹیشن بن جانا۔ یہ اسپریڈ شیٹ کرتی ہے، CSV نہیں۔ فائل میں ہندسے جوں کے توں ہیں؛ پروگرام نے انہیں float کی طرح دکھانے کا فیصلہ کیا۔ اس کالم کو متن کے طور پر امپورٹ کریں۔
مقامی وقت کی توقع۔ ٹائم اسٹیمپ UTC میں لکھے جاتے ہیں۔ Parquet انہیں عموماً ایک لمحے کے طور پر رکھتا ہے، اور انہیں اُس ٹائم زون میں بدلنا جہاں آپ کی مشین اتفاقاً ہے، ہر قدر کو خاموشی سے بدل دیتا۔ ضرورت ہو تو بعد میں جان بوجھ کر سرکائیں۔
nested برآمد دینا۔ struct، list یا map کالم والی فائل مسترد ہوتی ہے۔ پہلے pandas.json_normalize، Polars کے unnest، یا پتوں والے فیلڈ چننے والی DuckDB کوئری سے اسے سادہ کریں، سادہ Parquet لکھیں، پھر اسے تبدیل کریں۔
حدود: یہ ٹول کب مناسب نہیں
یہ پوری فائل یادداشت میں پڑھتا ہے، اس لیے چند سو میگابائٹ سے بڑی برآمدات DuckDB یا row group بہ row group اسٹریم کرنے والی چھوٹی اسکرپٹ سے بہتر سنبھلتی ہیں۔ Zstd، Brotli اور LZ4 کمپریشن آدھا کھولنے کے بجائے مسترد کیا جاتا ہے؛ ایسی فائلیں Snappy یا Gzip میں دوبارہ لکھیں۔ خفیہ کردہ Parquet جان بوجھ کر معاون نہیں۔ nested schema بھی دائرے سے باہر ہے، کیونکہ کسی list کالم کو CSV کے ایک خانے میں سمیٹنا آپ کے ڈیٹا سے متعلق فیصلہ ہے، جو کسی عام کنورٹر کو خاموشی سے نہیں کرنا چاہیے۔
رازداری
صفحے میں کوئی اپ لوڈ کوڈ نہیں، آپ کی فائل پر کوئی اینالیٹکس نہیں، اور تبدیلی کے دوران کوئی نیٹ ورک کال نہیں ہوتی۔ فائل براؤزر کے اپنے فائل انٹرفیس سے پڑھی جاتی ہے اور ٹیب ہی میں کھلتی ہے۔ اگر وعدے کے بجائے ثبوت چاہیے: صفحہ لوڈ کریں، انٹرنیٹ منقطع کریں، اور ایک فائل تبدیل کریں۔ نتیجہ بالکل وہی رہے گا، کیونکہ تار کے دوسرے سرے پر کبھی کچھ تھا ہی نہیں۔
Parquet سے CSV — عام سوالات
- کیا واقعی میرا ڈیٹا کہیں نہیں بھیجا جاتا؟
- بالکل۔ یہ کنورٹر سادہ JavaScript ہے جو فائل فیلڈ سے منتخب کی گئی بائٹس پڑھ کر اسی صفحے میں انہیں کھولتا ہے۔ نہ کوئی اپ لوڈ، نہ API کال، نہ آپ کے ڈیٹا پر کوئی اینالیٹکس۔ صفحہ لوڈ ہونے کے بعد آپ انٹرنیٹ بند کر سکتے ہیں اور ٹول پھر بھی چلے گا — خود تسلی کرنے کا یہی آسان ترین طریقہ ہے۔
- کون سی Parquet فائلیں چلتی ہیں؟
- pandas، PyArrow، Polars، DuckDB اور Spark جیسے عام ٹولز سے لکھی ہوئی سادہ ٹیبلز۔ بغیر کمپریشن، Snappy اور Gzip صفحات پڑھے جاتے ہیں، ساتھ ہی PLAIN، ڈکشنری، RLE، delta اور byte-stream-split انکوڈنگ اور ڈیٹا پیج v1 و v2 بھی۔ Zstd، Brotli، LZ4 اور خفیہ کردہ فائلیں غلط نتیجہ دینے کے بجائے واضح پیغام کے ساتھ مسترد ہوتی ہیں۔
- nested کالموں کا کیا بنتا ہے؟
- انہیں جان بوجھ کر مسترد کیا جاتا ہے۔ struct، list یا map کالم کی کوئی ایک واضح CSV شکل نہیں ہوتی، اور خاموشی سے کوئی ایک چن لینا آپ کا ڈیٹا خراب کر دے گا۔ پہلے pandas، Polars یا DuckDB میں ساخت کو سادہ کریں، سادہ Parquet لکھیں، پھر یہاں تبدیل کریں۔
- تاریخیں، ٹائم اسٹیمپ اور decimal کیسے لکھے جاتے ہیں؟
- تاریخیں YYYY-MM-DD کی شکل میں آتی ہیں۔ ٹائم اسٹیمپ UTC میں YYYY-MM-DD HH:MM:SS کی شکل میں آتے ہیں اور کالم میں موجود ملی سیکنڈ، مائیکرو سیکنڈ یا نینو سیکنڈ کے ہندسے برقرار رہتے ہیں۔ decimal کالم اپنی درست اعشاریہ جگہ متن کے طور پر رکھتے ہیں، اس لیے 12.30 ویسا ہی رہتا ہے اور گول شدہ float نہیں بنتا۔ خالی اقدار خالی خانے بن جاتی ہیں۔