如何获取ApacheBeamSQL查询的输出模式?

如何获取ApacheBeamSQL查询的输出模式?,sql,apache-beam,apache-calcite,Sql,Apache Beam,Apache Calcite,我一直在使用beamsqldsl,如果不提供一个能够手动识别输出模式的编码器,我就无法使用查询的输出。我可以推断输出模式而不是硬编码它吗 或实际都不使用查询的输出。我使用的是而不是普通的JavaAPI来保持代码相对可读和简洁,我不认为这对这个问题有什么影响 这里有一个例子来说明我的意思 给定inSchema中的输入模式和映射到一行的某些数据源,如下所示:在本例中,基于Avro,但我认为这并不重要: sc.avroFile[Foo](args("input")) .map(fooToRow)

我一直在使用beamsqldsl,如果不提供一个能够手动识别输出模式的编码器,我就无法使用查询的输出。我可以推断输出模式而不是硬编码它吗

或实际都不使用查询的输出。我使用的是而不是普通的JavaAPI来保持代码相对可读和简洁,我不认为这对这个问题有什么影响

这里有一个例子来说明我的意思

给定inSchema中的输入模式和映射到一行的某些数据源,如下所示:在本例中,基于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输出匹配的行编码器(在本例中为单计数int列):

   ...snip...
   .applyTransform(SqlTransform.query("SELECT COUNT(1) FROM PCOLLECTION"))
   .setCoder(Schema.builder().addInt64Field("count").build().getRowCoder)
   .saveAsTextFile(args("output"))
现在管道运行良好

考虑到我们指定了输入模式/编码器和查询,必须手动告诉管道如何对SQL输出进行编码似乎是不必要的。在我看来,我们应该能够从中推断出输出模式——但除了直接使用方解石之外,我不知道如何推断


在开罚单之前,我想我应该检查一下我没有遗漏什么明显的东西

输出模式推断,您的期望是正确的。这似乎是Beam或Scio中的一个缺陷,已提交调查。

我认为这是Scio中的一个缺陷——事实证明,管道在纯Java中工作。然后我看到Scio在应用了一个变换后设置了编码器本身,也许这就是问题所在。我会在回购协议上开出罚单谢谢你的跟进!我会用你的发现更新Jira。我不熟悉Scio在扩展PTrasnforms时是如何设置编码器的,但它看起来确实像是bug所在的地方。总体而言,Beam SQL和模式正在积极开发中,不时会出现bug和破坏性更改。另外据我所知,Beam SQL和模式目前都没有针对Scio进行显式测试,因此可能存在额外的问题。