Spark: невозможно загрузить файлы паркета из HDFS до тех пор, пока они не будут "помещены" в hdfs
У меня есть приложение aC#, которое создает и загружает файлы паркета на удаленную HDFS. Если я скопирую файл с помощью scp на целевой компьютер с установленным клиентом HDFS, а затем "hdfs поместит" файл в HDFS, спарк сможет правильно прочитать файл.
Если я загружаю файл напрямую в HDFS из клиентского приложения, используя curl для служб webhdf, я получаю следующую ошибку от Spark при попытке прочитать файл паркета:
df = sqlContext.read.parquet ("/ tmp / test.parquet") Traceback (последний вызов был последним): файл "", строка 1, в файле "/usr/hdp/current/spark2-client/python/pyspark/sql/readwriter.py", строка 303, в паркет возвращается self._df(self._jreader.parquet(_to_seq(self._spark._sc, paths))) Файл"/usr/hdp/current/spark2-client/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", строка 1257, в файле вызова "/usr/hdp/current/spark2-client/python/pyspark/sql/utils.py", строка 69, в деке поднять AnalysisException(s.split(': ', 1)[1], stackTrace) pyspark.sql.utils.AnalysisException: u'Не удается вывести схему для Parquet. Это должно быть указано вручную.;
Если я извлекаю оба файла (загруженный scp и файл, загруженный через curl) в локальную файловую систему и выполняю двоичный diff между файлами, diff не показывает никакой разницы. Если я снова помещу файл в HDFS (тот, который был загружен с помощью curl и webhdfs), тогда Spark сможет хорошо прочитать файл партера.
Это что-то вроде "hdfs put", созданного для того, чтобы spark хорошо читал паркетный файл.
Что может происходить? Спасибо
ОБНОВЛЕНИЕ: если я получаю локальный каталог с несколькими паркетами и снова помещаю его в HDFS, он не работает, я должен поместить файлы паркета один за другим, чтобы их читал искра
2 ответа
Я наконец выяснил причину ошибки. Название загружаемых файлов начинается с символа "_". Это была причина, почему спарк не смог загрузить файл паркета.
Проверяли ли вы, чтобы службы webhdfs помещали файл по тому же пути (/tmp/test.parquet)? Другими словами, можете ли вы загрузить файл (который был загружен через webhdfs) с помощью клиента hdfs (hdfs get)?
Бесты, фей