mikaio.dev/freetools

Parquet से CSV कन्वर्टर

बिना कुछ इंस्टॉल किए Apache Parquet फ़ाइल खोलें और उसे CSV में बदलें। फ़ाइल आपके ब्राउज़र टैब के भीतर ही पढ़ी जाती है — वह डिवाइस से बाहर नहीं जाती, इसलिए इंटरनेट बंद होने पर भी काम चलता है।

फ़ाइल स्थानीय रूप से पढ़ी जाती है। न अपलोड, न सर्वर, न ट्रैकिंग।

यह कन्वर्टर क्या करता है

Apache Parquet वही फ़ॉर्मैट है जो आज लगभग हर डेटा पाइपलाइन लिखती है: कॉलम-आधारित, संपीड़ित, बाइनरी और एनालिटिक्स इंजनों के लिए बना हुआ। मशीन के लिए यह शानदार है, इंसानी आँख के लिए बेकार। इसे टेक्स्ट एडिटर में नहीं खोला जा सकता, स्प्रेडशीट में काम करने वाले सहकर्मी को सीधे नहीं भेजा जा सकता, और किसी टिकट में चिपकाया भी नहीं जा सकता। CSV इसका उलट है: विश्लेषण के लिए भद्दा, मगर हर जगह पढ़ने लायक।

यह पेज दोनों सिरों को सबसे सीधे तरीके से जोड़ता है। आप डिस्क से एक .parquet फ़ाइल चुनते हैं, पेज उसे डिकोड करता है, बताता है कि कितनी पंक्तियाँ और कॉलम मिले, एक झलक दिखाता है, और डाउनलोड के लिए CSV तैयार कर देता है। न खाता, न कतार, न अपलोड की प्रगति पट्टी — क्योंकि इस पूरी प्रक्रिया में कोई सर्वर शामिल ही नहीं होता।

यही आख़िरी बात इस टूल के होने की वजह है। ज़्यादातर ऑनलाइन Parquet कन्वर्टर असल में एक फ़ॉर्म हैं जो आपकी फ़ाइल किसी बैकएंड को भेज देता है। अगर फ़ाइल में ग्राहक रिकॉर्ड, वेतन, मरीज़ की पहचान या डेटा नीति के दायरे में आने वाली कोई भी चीज़ है, तो वही भेजना पूरी समस्या है। यहाँ रूपांतरण आपके टैब में चल रहा JavaScript है, जो उन्हीं बाइट्स को पढ़ता है जो फ़ाइल चुनते ही ब्राउज़र ने पेज को सौंप दी थीं।

चार क़दम में इस्तेमाल

  1. फ़ाइल फ़ील्ड में अपनी .parquet फ़ाइल चुनें। उससे पहले कुछ नहीं होता।
  2. सेपरेटर चुनें। कॉमा डिफ़ॉल्ट है; सेमीकोलन उन स्प्रेडशीट के लिए ठीक रहता है जहाँ कॉमा दशमलव चिह्न है; टैब से बनने वाली TSV ज़्यादातर स्प्रेडशीट प्रोग्राम में साफ़ चिपकती है।
  3. तय करें कि पहली पंक्ति में कॉलम के नाम रहें या नहीं। हेडर का चेकबॉक्स पहले से चालू है और उसे बदलते ही आउटपुट तुरंत नए सिरे से बनता है, फ़ाइल दोबारा पढ़े बिना।
  4. झलक देखें और CSV डाउनलोड करें दबाएँ। झलक में पहली 200 पंक्तियाँ दिखती हैं ताकि पेज हल्का रहे; डाउनलोड की गई फ़ाइल में Parquet की सारी पंक्तियाँ रहती हैं।

रूपांतरण के बाद सेपरेटर या हेडर बदलने पर फ़ाइल दोबारा डिस्क से नहीं पढ़ी जाती। डिकोड की गई टेबल टैब की मेमोरी में रहती है, इसलिए लाखों पंक्तियों पर भी ये बदलाव तत्काल होते हैं।

Parquet टेबल कैसे रखता है, और रूपांतरण आसान क्यों नहीं

CSV पंक्तियों की एक धारा है। Parquet इसका उलटा करता है: वह हर कॉलम अलग रखता है, row group नाम के ब्लॉकों में, और एक row group के भीतर कॉलम कई पेजों से बने chunk में रहता है। हर पेज संपीड़ित हो सकता है, और उसके भीतर के मान कई अलग तरीक़ों से एन्कोड हो सकते हैं।

इसलिए इसे पढ़ने का मतलब है कई परतें खोलना:

जब सब ठीक चलता है तो इनमें से कुछ मायने नहीं रखता; मायने तब रखता है जब कुछ बिगड़े। चूँकि डिकोडर हर परत समझता है, असमर्थित फ़ाइल पर वह कंप्रेशन, एन्कोडिंग या नेस्टिंग के बारे में साफ़ संदेश देता है, चुपचाप बिगड़ी हुई CSV नहीं।

हल किया हुआ उदाहरण: कौन-से मान दिखेंगे

तीन Parquet प्रकारों का CSV में सीधा समकक्ष नहीं है, इसलिए जान लेना ठीक रहेगा कि आउटपुट में क्या आता है।

तारीख़ का कॉलम। DATE प्रकार 1 जनवरी 1970 से गिने गए दिनों की 32-बिट संख्या रखता है। अगर संग्रहित संख्या 19723 है, तो युग के 19723 दिन बाद 1 जनवरी 2024 आता है और CSV खाना 2024-01-01 लिखा जाता है। कोई टाइमज़ोन नहीं लगाया जाता, क्योंकि तारीख़ में खिसकाने लायक समय होता ही नहीं।

माइक्रोसेकंड टाइमस्टैम्प। माइक्रोसेकंड परिशुद्धता वाला TIMESTAMP कॉलम युग से गिने माइक्रोसेकंड की 64-बिट संख्या रखता है। मान 1704112215123456 लीजिए। इसे 1,000,000 से भाग देने पर 1704112215 पूरे सेकंड बचते हैं, यानी 1 जनवरी 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 लिखा जाता है। यही वजह है कि वित्तीय कॉलम को कभी फ़्लोट से नहीं गुज़ारना चाहिए: टेक्स्ट सटीक मान भी बचाता है और schema का वादा किया गया दशमलव स्थान भी।

बूलियन true और false लिखे जाते हैं, ख़ाली मान ख़ाली खाने बनते हैं, और जो बाइनरी कॉलम वैध UTF-8 नहीं हैं वे base64 में लिखे जाते हैं ताकि कच्ची बाइट्स CSV की संरचना न तोड़ें।

ऑफ़लाइन कन्वर्टर कहाँ काम आता है

सबसे साफ़ मामला गोपनीयता है: उपयोगकर्ता रिकॉर्ड का एक निर्यात, जिसे साझा ड्राइव के पास पहुँचने से पहले आप एक नज़र देख लेना चाहते हैं। कुछ भी लैपटॉप से बाहर नहीं जाता, इसलिए कोई नीति मोड़नी नहीं पड़ती।

दूसरा मामला झंझट का है। सहकर्मी ने Parquet निर्यात भेजा, आपको तीन कॉलम जाँचने हैं, और पाँच मिनट में मिटा दी जाने वाली फ़ाइल देखने के लिए Python और PyArrow इंस्टॉल करना बेतुकी क़ीमत है। एक टैब खोलना नहीं।

तीसरा मामला वह मशीन है जिसे बदलने का हक़ आपके पास नहीं: बंद किया हुआ कंपनी लैपटॉप, ग्राहक का कंप्यूटर, लैब की मशीन जहाँ पैकेज नहीं चढ़ते। ब्राउज़र वहाँ पहले से मौजूद है।

चौथा मामला पढ़ाने का है। एक ही टेबल को पहले अपारदर्शी बाइनरी गुच्छे और फिर सादे टेक्स्ट के रूप में देखना कॉलम-आधारित बनाम पंक्ति-आधारित भंडारण का फ़र्क़ इतना ठोस बना देता है, जितना कोई आरेख शायद ही कर पाए।

आम ग़लतियाँ और उनसे बचाव

CSV स्प्रेडशीट में खोलने पर एक विशाल कॉलम दिखना। आपका प्रोग्राम अपनी भाषा-सेटिंग वाला सेपरेटर चाहता है। सेमीकोलन विकल्प से फ़ाइल दोबारा बनाएँ, या इम्पोर्ट डायलॉग में सेपरेटर स्पष्ट बताएँ।

लंबे संख्यात्मक पहचानकर्ता वैज्ञानिक संकेतन बन जाना। यह स्प्रेडशीट करती है, CSV नहीं। फ़ाइल में अंक ज्यों के त्यों हैं; प्रोग्राम ने उन्हें फ़्लोट की तरह दिखाना तय किया। उस कॉलम को टेक्स्ट के रूप में इम्पोर्ट करें।

स्थानीय समय की उम्मीद रखना। टाइमस्टैम्प UTC में लिखे जाते हैं। Parquet उन्हें प्रायः एक क्षण के रूप में रखता है, और उन्हें आपकी मशीन के संयोगवश मौजूद टाइमज़ोन में बदलना हर मान को चुपचाप बदल देता। ज़रूरत हो तो बाद में जान-बूझकर खिसकाइए।

नेस्टेड निर्यात देना। struct, list या map कॉलम वाली फ़ाइल अस्वीकार होती है। पहले pandas.json_normalize, Polars के unnest, या पत्ती-फ़ील्ड चुनने वाली DuckDB क्वेरी से उसे सपाट करें, सपाट Parquet लिखें, फिर उसे बदलें।

सीमाएँ: यह टूल कब सही नहीं है

यह पूरी फ़ाइल मेमोरी में पढ़ता है, इसलिए कुछ सौ मेगाबाइट से बड़े निर्यात DuckDB या row group दर row group स्ट्रीम करने वाली छोटी स्क्रिप्ट से बेहतर सँभलते हैं। Zstd, Brotli और LZ4 कंप्रेशन आधा-अधूरा डिकोड होने के बजाय अस्वीकार होता है; ऐसी फ़ाइलें Snappy या Gzip में दोबारा लिखें। एन्क्रिप्टेड Parquet जानबूझकर समर्थित नहीं है। नेस्टेड schema भी दायरे से बाहर है, क्योंकि लिस्ट कॉलम को CSV के एक खाने में समेटना आपके डेटा से जुड़ा फ़ैसला है, जिसे कोई सामान्य कन्वर्टर चुपचाप नहीं ले सकता।

निजता

पेज में कोई अपलोड कोड नहीं है, आपकी फ़ाइल पर कोई एनालिटिक्स नहीं है, और रूपांतरण के दौरान कोई नेटवर्क कॉल नहीं होती। फ़ाइल ब्राउज़र के अपने फ़ाइल इंटरफ़ेस से पढ़ी जाती है और टैब में ही डिकोड होती है। वादे के बजाय प्रमाण चाहिए तो: पेज लोड करें, इंटरनेट बंद करें और एक फ़ाइल बदलें। नतीजा वही रहेगा, क्योंकि तार के दूसरे सिरे पर कभी कुछ था ही नहीं।

Parquet से CSV — सामान्य सवाल

क्या सचमुच मेरा डेटा कहीं अपलोड नहीं होता?
हाँ, बिल्कुल। यह कन्वर्टर सादा JavaScript है जो फ़ाइल फ़ील्ड से चुनी गई बाइट्स पढ़कर उसी पेज में डिकोड करता है। कोई अपलोड, कोई API कॉल और आपके डेटा पर कोई एनालिटिक्स नहीं। पेज लोड होने के बाद आप इंटरनेट बंद कर सकते हैं और टूल फिर भी चलेगा — खुद जाँचने का यही सबसे आसान तरीका है।
किस तरह की Parquet फ़ाइलें चलती हैं?
pandas, PyArrow, Polars, DuckDB और Spark जैसी सामान्य लाइब्रेरियों से लिखी सपाट टेबल। बिना कंप्रेशन, Snappy और Gzip पेज पढ़े जाते हैं, साथ ही PLAIN, डिक्शनरी, RLE, delta और byte-stream-split एन्कोडिंग तथा डेटा पेज v1 व v2। Zstd, Brotli, LZ4 और एन्क्रिप्टेड फ़ाइलें गलत नतीजा देने के बजाय साफ़ संदेश के साथ अस्वीकार होती हैं।
नेस्टेड कॉलम का क्या होता है?
उन्हें जानबूझकर अस्वीकार किया जाता है। struct, list या map कॉलम का कोई एक स्वाभाविक CSV रूप नहीं होता, और चुपचाप कोई एक चुन लेना आपके डेटा को बिगाड़ देगा। पहले pandas, Polars या DuckDB में नेस्टिंग सपाट करें, सपाट Parquet लिखें, फिर यहाँ बदलें।
तारीख़, टाइमस्टैम्प और decimal कैसे लिखे जाते हैं?
तारीख़ YYYY-MM-DD में आती है। टाइमस्टैम्प UTC में YYYY-MM-DD HH:MM:SS के रूप में आता है और कॉलम में मौजूद मिलीसेकंड, माइक्रोसेकंड या नैनोसेकंड अंक बने रहते हैं। decimal कॉलम अपनी सटीक दशमलव जगह के साथ टेक्स्ट में रहते हैं, इसलिए 12.30 वैसा ही रहता है, गोल किया हुआ फ़्लोट नहीं बनता। खाली मान खाली फ़ील्ड बनते हैं।