Как прочитать источник данных orc в потоковой структурированной искре? - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь прочитать поток orc в java:

Набор данных d2 = sparkSession.readStream (). Format ("orc") .option ("path", "file: /// Users / rahulkumar/work/structuredstreaming/maporc/").load();

, которая выдает следующую ошибку

Exception in thread "main" java.lang.IllegalArgumentException: Schema must be specified when creating a streaming source DataFrame. If some files already exist in the directory, then depending on the file format you may be able to create a static DataFrame on that directory with 'spark.read.load(directory)' and infer schema from it.
    at org.apache.spark.sql.execution.datasources.DataSource.sourceSchema(DataSource.scala:222)
    at org.apache.spark.sql.execution.datasources.DataSource.sourceInfo$lzycompute(DataSource.scala:88)
    at org.apache.spark.sql.execution.datasources.DataSource.sourceInfo(DataSource.scala:88)
    at org.apache.spark.sql.execution.streaming.StreamingRelation$.apply(StreamingRelation.scala:30)
    at org.apache.spark.sql.streaming.DataStreamReader.load(DataStreamReader.scala:150)
}

В пакетной обработке схемы из файлов orc выводятся по умолчанию.Я ожидал то же самое и здесь, но это не работает.

1 Ответ

0 голосов
/ 19 декабря 2018

По умолчанию для структурированной потоковой передачи из файловых источников требуется указать схему, а не полагаться на Spark для ее автоматического вывода.Это ограничение гарантирует, что согласованная схема будет использоваться для потокового запроса даже в случае сбоев.Для специальных случаев использования вы можете повторно включить вывод схемы, установив для spark.sql.streaming.schemaInference значение true.

Источник: https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#schema-inference-and-partition-of-streaming-dataframesdatasets


В общем Iсказал бы, что плохая идея полагаться на вывод схемы при пакетных заданиях в производительной среде.
Во-первых, это сложный процесс, который будет занимать время вычислений.
Во-вторых, независимо от того, какую обработку вы будете выполнятьпытаясь сделать на ваших данных, вы наверняка будете предполагать какую-то схему.Таким образом, почему бы не применять его с самого начала и дать сбой, как только данные не соответствуют вашим предположениям.

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


Тем не менее, я бы предложил использовать Datasets вместо DataFrames Scala вместо Java ) для обеспечения безопасности типов, таким образом вы можете создать case class для представления вашегоданные и получить схему из него - однако, это только мое личное предпочтение и мнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...