Обхід помилки "Illegal Parquet type" при роботі з PySpark та Parquet файлами

Обхід помилки “Illegal Parquet type” при роботі з PySpark та Parquet файлами

3 Березня 2024 в 13:21 41

Працюючи з великими обсягами даних, аналітики та розробники часто стикаються з необхідністю використовувати ефективні інструменти для збереження та обробки даних. Parquet файл як формат зберігання даних колонкового типу набув широкого розповсюдження завдяки своїй ефективності та оптимізації. Однак, при роботі з Parquet файлами, створеними за допомогою Pandas та Pyarrow, в PySpark може виникнути специфічна помилка: “Illegal Parquet type: INT64 (TIMESTAMP(NANOS,false))”. Ця стаття розглядає практичні підходи до вирішення цієї проблеми.

Причини виникнення помилки

Перед тим як говорити про рішення, важливо зрозуміти причину виникнення помилки. Parquet файл, як формат, підтримує збереження даних у різних типах, включаючи TIMESTAMP. Pyarrow, бібліотека, що часто використовується для роботи з Parquet у Python, дозволяє зберігати TIMESTAMP дані з наносекундами (NANOS), використовуючи тип INT64. Однак, PySpark до недавнього часу не підтримував читання даного типу без певних налаштувань, що призводило до згаданої помилки.

Методи вирішення
Настройка PySpark для підтримки INT96

Один із способів обходу помилки – це використання опції конфігурації PySpark, що дозволяє читати TIMESTAMP дані, збережені у форматі INT96. Це можна зробити за допомогою встановлення параметра конфігурації "spark.sql.parquet.int96TimestampConversion" у значення true. Ця опція змусить PySpark конвертувати INT96 дані у внутрішній формат TIMESTAMP, обходячи проблему:

Використання опції “mergeSchema”

Іншим рішенням може стати активація опції "mergeSchema" при читанні Parquet файлів. Ця опція забезпечує гнучкість при злитті схем даних, дозволяючи PySpark адаптуватися до змін у типах даних між збереженими файлами та очікуваною схемою DataFrame:

Читання файлу як байтів

Якщо жоден із вищезазначених методів не працює, можна спробувати більш низькорівневий підхід, який полягає в читанні Parquet файлу не як датафрейм, а як байтового потоку, з подальшим його конвертуванням у формат, сумісний з PySpark. Цей метод вимагає додаткової роботи та може бути менш продуктивним, але він забезпечує максимальну гнучкість при роботі з нестандартними форматами даних.

Висновок

Помилка “Illegal Parquet type: INT64 (TIMESTAMP(NANOS,false))” у PySpark є викликом, який можна подолати за допомогою правильної конфігурації та підходів до читання даних. Використання опцій spark.sql.parquet.int96TimestampConversion та mergeSchema, а також низькорівневе читання файлів, надає потрібну гнучкість для ефективної роботи з Parquet файлами в PySpark, незалежно від їх внутрішньої структури та типів даних. Оволодівши цими техніками, аналітики та розробники можуть ефективно обробляти великі обсяги даних, мінімі