Действительный файл паркета, но ошибка со схемой паркета

У меня был правильный паркетный файл (уверен на 100%) и только один файл в этой директории v3io://projects/risk/FeatureStore/ptp/parquet/sets/ptp/1681296898546_70/. Я получил эту общую ошибку AnalysisException: Unable to infer schema ... во время операции чтения, см. полную информацию об ошибке:

---------------------------------------------------------------------------
AnalysisException                         Traceback (most recent call last)
<ipython-input-26-5beebfd65378> in <module>
      1 #error
----> 2 new_DF=spark.read.parquet("v3io://projects/risk/FeatureStore/ptp/parquet/")
      3 new_DF.show()
      4 
      5 spark.close()

/spark/python/pyspark/sql/readwriter.py in parquet(self, *paths, **options)
    299                        int96RebaseMode=int96RebaseMode)
    300 
--> 301         return self._df(self._jreader.parquet(_to_seq(self._spark._sc, paths)))
    302 
    303     def text(self, paths, wholetext=False, lineSep=None, pathGlobFilter=None,

/spark/python/lib/py4j-0.10.9.3-src.zip/py4j/java_gateway.py in __call__(self, *args)
   1320         answer = self.gateway_client.send_command(command)
   1321         return_value = get_return_value(
-> 1322             answer, self.gateway_client, self.target_id, self.name)
   1323 
   1324         for temp_arg in temp_args:

/spark/python/pyspark/sql/utils.py in deco(*a, **kw)
    115                 # Hide where the exception came from that shows a non-Pythonic
    116                 # JVM exception message.
--> 117                 raise converted from None
    118             else:
    119                 raise

AnalysisException: Unable to infer schema for Parquet. It must be specified manually.

Я использовал этот код:

new_DF=spark.read.parquet("v3io://projects/risk/FeatureStore/ptp/parquet/")
new_DF.show()

странно, что это работало правильно, когда я использовал полный путь к файлу паркета:

new_DF=spark.read.parquet("v3io://projects/risk/FeatureStore/ptp/parquet/sets/ptp/1681296898546_70/")
new_DF.show()

У вас была похожая проблема?

кажется, что не все файлы паркета в v3io://projects/risk/FeatureStore/ptp/parquet/ имеют одинаковую схему

Abdennacer Lachiheb 14.04.2023 23:43

Я бы согласился с @AbdennacerLachiheb, это ошибка, которую вы, вероятно, получите, если не все файлы имеют одинаковую схему. Проверьте файлы еще раз.

Zer0k 15.04.2023 01:00

Есть только один файл с валидным контактом и это странно

JIST 15.04.2023 03:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
171
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Ошибка возникает из-за того, что файл паркета находится не в папке "v3io://projects/risk/FeatureStore/ptp/parquet/", а в папке "v3io://projects/risk/FeatureStore/ptp/parquet/sets/ptp/1681296898546_70/".

Это будет работать:

new_DF=spark.read.parquet("v3io://projects/risk/FeatureStore/ptp/parquet/*/*/*")
new_DF.show()

Синтаксис * читает все в каталоге.

Для получения дополнительной информации о массовом чтении файлов с помощью spark.read проверьте этот вопрос: Регулярное выражение для даты между датой начала и датой окончания

Обычно вы никогда не должны видеть эту ошибку при чтении паркета, потому что схема уже находится в файле паркета, по моему опыту, вот несколько причин, по которым вы видите эту ошибку:

  1. Паркет, который вы пытаетесь прочитать, по какой-то странной причине пуст. искра выдает эту ошибку, когда паркет пуст, однако это не кажется проблемой, так как у вас есть файл паркета под "v3io://проекты/риск/FeatureStore/ptp/parquet/sets/ptp/1681296898546_70/"

  2. У вас могут быть файлы паркета с другой схемой по указанному вами пути. пытаются читать, например

    /path/
         partition=value1/
             part-000...snappy.parquet
         partition=value2/
             part-000...snappy.parquet 
    

    Если 2 паркета не имеют одинаковой схемы, вы получите эту ошибку.

  3. По пути "v3io://projects/risk/FeatureStore/ptp/parquet/" для во всех подкаталогах у вас могут быть файлы, отличные от файлов паркета.

Несмотря на то, что проблема может быть указана выше, это может быть другая проблема, потому что недостаточно информации о файлах в разделе «v3io://projects/risk/FeatureStore/ptp/parquet/», я предлагаю вам добавить в свой пост весь дерево по этому пути вместе со схемой для всех файлов паркета.

Обновлять

Присмотревшись к твоему пути, я вижу проблему, этот путь

sets/ptp/1681296898546_70

Должно быть так

Patition1=sets/Patition2=ptp/Patition3=1681296898546_70

В spark вы либо указываете непосредственно на свой паркет, либо на каталог раздела, вы не можете указать путь, который не содержит ни паркета, ни раздела.

Во всем каталоге и подкаталогах есть только один паркетный файл (с корректным содержимым) (странная ситуация).

JIST 15.04.2023 16:32

Эта часть кода (с recursiveFileLookup=true) также помогает решить проблему:

new_DF=spark.read.option("recursiveFileLookup","true").parquet("v3io://projects/risk/FeatureStore/ptp/parquet/")
new_DF.show()

Другие вопросы по теме