Как получить схему вывода для SQL-запроса Apache Beam?
Я играл с Beam SQL DSL и не могу использовать вывод запроса, не предоставив кодер, который знает схему вывода вручную. Могу ли я вывести схему вывода вместо ее жесткого кодирования?
Ни в пошаговом руководстве, ни в примерах не используются выходные данные запроса. Я использую Scio, а не простой Java API, чтобы сделать код относительно читабельным и лаконичным, я не думаю, что это имеет значение для этого вопроса.
Вот пример того, что я имею в виду.
Учитывая входную схему inSchema
и некоторый источник данных, который отображается на Row
следующим образом: (в этом примере, на основе Avro, но опять же, я не думаю, что это имеет значение):
sc.avroFile[Foo](args("input"))
.map(fooToRow)
.setCoder(inSchema.getRowCoder)
.applyTransform(SqlTransform.query("SELECT COUNT(1) FROM PCOLLECTION"))
.saveAsTextFile(args("output"))
Запуск этого конвейера приводит к KryoException
следующее:
com.esotericsoftware.kryo.KryoException: java.lang.NullPointerException
Serialization trace:
fieldIndices (org.apache.beam.sdk.schemas.Schema)
schema (org.apache.beam.sdk.values.RowWithStorage)
org.apache.beam.sdk.Pipeline$PipelineExecutionException:
com.esotericsoftware.kryo.KryoException: java.lang.NullPointerException
Тем не менее, вставка RowCoder
соответствие выходных данных SQL, в данном случае один столбец типа int:
...snip...
.applyTransform(SqlTransform.query("SELECT COUNT(1) FROM PCOLLECTION"))
.setCoder(Schema.builder().addInt64Field("count").build().getRowCoder)
.saveAsTextFile(args("output"))
Теперь трубопровод работает просто отлично.
Необходимость вручную указывать конвейеру, как кодировать выходные данные SQL, кажется ненужной, учитывая, что мы указываем входную схему / кодер (ы) и запрос. Мне кажется, что мы должны быть в состоянии вывести выходную схему из этого - но я не могу понять, как, кроме, возможно, прямого использования Calcite?
Прежде чем поднять билет на Beam Jira, я решил проверить, не пропустил ли я что-то очевидное!
1 ответ
Вывод схемы вывода должен работать, ваши ожидания верны. Это похоже на ошибку (в Beam или Scio), поданную BEAM-5335 для расследования.