Невозможно вывести схему при загрузке файла Parquet

response = "mi_or_chd_5"

outcome = sqlc.sql("""select eid,{response} as response
from outcomes
where {response} IS NOT NULL""".format(response=response))
outcome.write.parquet(response, mode="overwrite") # Success
print outcome.schema
StructType(List(StructField(eid,IntegerType,true),StructField(response,ShortType,true)))

Но потом:

outcome2 = sqlc.read.parquet(response)  # fail

не удается с:

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

в

/usr/local/lib/python2.7/dist-packages/pyspark-2.1.0+hadoop2.7-py2.7.egg/pyspark/sql/utils.pyc in deco(*a, **kw)

Документация для паркета говорит, что формат самоописывается, и полная схема была доступна, когда файл паркета был сохранен. Что дает?

Использование Spark 2.1.1. Также не работает в 2.2.0.

Нашел этот отчет об ошибке, но был исправлен в 2.0.1, 2.1.0.

ОБНОВЛЕНИЕ: Это работает при подключении к master = "local" и завершается ошибкой при подключении к master = "mysparkcluster".

Ответ 1

Эта ошибка обычно возникает, когда вы пытаетесь прочитать пустой каталог как паркет. Вероятно, ваш результат Dataframe пуст.

Вы можете проверить, пуст ли DataFrame с outcome.rdd.isEmpty() перед его записью.

Ответ 2

В моем случае ошибка произошла, потому что я пытался прочитать файл паркета, который начинался с подчеркивания (например, _lots_of_data.parquet). Не уверен, почему это было проблемой, но устранение главного подчеркивания решило проблему.

Смотрите также:

Ответ 3

Этот случай возникает, когда вы пытаетесь прочитать таблицу, которая пуста. Если таблица правильно вставила данные, проблем не должно быть.

Кроме того, с паркетами то же самое происходит с ORC.

Ответ 4

Я использую AWS Glue и получил эту ошибку при чтении данных из таблицы каталога данных (местоположение: корзина s3). После небольшого анализа я понял, что это связано с тем, что файл не доступен в расположении файла (в моем случае путь корзины s3).

Glue пытался применить схему таблицы каталога данных к файлу, который не существует.

После копирования файла в местоположение файла корзины s3 проблема была решена.

Надеюсь, это поможет кому-то, кто столкнулся с ошибкой в AWS Glue.

Ответ 5

В моем случае ошибка произошла из-за того, что в имени файла содержатся символы подчеркивания. Перезапись/чтение файла без подчеркивания (дефисы были в порядке) решили проблему...

Ответ 6

Я столкнулся с аналогичной проблемой при чтении csv

spark.read.csv("s3a://bucket/spark/csv_dir/.")

дал ошибку:

org.apache.spark.sql.AnalysisException: Unable to infer schema for CSV. It must be specified manually.;

Я обнаружил, что удалил трейлинг . и тогда это работает. то есть:

spark.read.csv("s3a://bucket/spark/csv_dir/")

Я проверил это для parquet добавив трейлинг . и вы получите сообщение об ошибке:

org.apache.spark.sql.AnalysisException: Unable to infer schema for Parquet. It must be specified manually.;

Ответ 7

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

Ответ 8

Просто чтобы подчеркнуть ответ @Davos в комментарии, вы столкнетесь с точной ошибкой исключения, если в имени вашего файла есть точка . или подчеркивание _ в начале имени файла

val df = spark.read.format("csv").option("delimiter", "|").option("header", "false")
         .load("/Users/myuser/_HEADER_0")

org.apache.spark.sql.AnalysisException: 
Unable to infer schema for CSV. It must be specified manually.;

Решение состоит в том, чтобы переименовать файл и повторить попытку (например, _HEADER переименовать в HEADER)

Ответ 9

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