Ответ 1
Эта ошибка обычно возникает, когда вы пытаетесь прочитать пустой каталог как паркет. Вероятно, ваш результат Dataframe пуст.
Вы можете проверить, пуст ли DataFrame с outcome.rdd.isEmpty()
перед его записью.
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".
Эта ошибка обычно возникает, когда вы пытаетесь прочитать пустой каталог как паркет. Вероятно, ваш результат Dataframe пуст.
Вы можете проверить, пуст ли DataFrame с outcome.rdd.isEmpty()
перед его записью.
В моем случае ошибка произошла, потому что я пытался прочитать файл паркета, который начинался с подчеркивания (например, _lots_of_data.parquet
). Не уверен, почему это было проблемой, но устранение главного подчеркивания решило проблему.
Смотрите также:
Этот случай возникает, когда вы пытаетесь прочитать таблицу, которая пуста. Если таблица правильно вставила данные, проблем не должно быть.
Кроме того, с паркетами то же самое происходит с ORC.
Я использую AWS Glue и получил эту ошибку при чтении данных из таблицы каталога данных (местоположение: корзина s3). После небольшого анализа я понял, что это связано с тем, что файл не доступен в расположении файла (в моем случае путь корзины s3).
Glue пытался применить схему таблицы каталога данных к файлу, который не существует.
После копирования файла в местоположение файла корзины s3 проблема была решена.
Надеюсь, это поможет кому-то, кто столкнулся с ошибкой в AWS Glue.
В моем случае ошибка произошла из-за того, что в имени файла содержатся символы подчеркивания. Перезапись/чтение файла без подчеркивания (дефисы были в порядке) решили проблему...
Я столкнулся с аналогичной проблемой при чтении 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.;
Я вижу, что ответов уже так много. Но проблема, с которой я столкнулся, заключалась в том, что моя работа Spark пыталась прочитать файл, который был перезаписан другой задачей Spark, которая была ранее запущена. Звучит плохо, но я совершил эту ошибку.
Просто чтобы подчеркнуть ответ @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
)
я получил ту же ошибку, потому что мой каталог не содержит файлов паркет и, следовательно, был пуст