如何获得Apache Beam SQL查询的输出模式?

时间:2018-09-05 09:32:51

标签: sql apache-beam apache-calcite

我一直在使用Beam SQL DSL,如果不提供手动识别输出模式的编码器,就无法使用查询的输出。我可以推断输出架构而不是对其进行硬编码吗?

walkthroughexamples均未实际使用查询的输出。我使用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

但是,插入与SQL输出匹配的RowCoder,在本例中为单个count 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 个答案:

答案 0 :(得分:1)

输出模式推断should work,您的期望是正确的。这似乎是一个错误(无论是Beam还是Scio),已提交BEAM-5335进行调查。