扳手

时间:2018-06-13 08:30:15

标签: google-cloud-dataflow apache-beam google-cloud-spanner

我在Spanner中执行查询:"SELECT e.name,d.name FROM emp as e, department as d WHERE e.dept = d.dept;",它在Spanner控制台上运行得非常好。 但是当我尝试使用Apache Beam触发相同的查询时,它给出了一个错误说:

java.lang.RuntimeException: org.apache.beam.sdk.util.UserCodeException: com.google.cloud.spanner.SpannerException: INVALID_ARGUMENT: io.grpc.StatusRuntimeException: INVALID_ARGUMENT: Queries with more than one DistributedUnion are currently considered not partitionable. Please view the query plan through the dev console, gcloud or using the API.

我正在使用的Apache Beam代码是:

p.apply(SpannerIO.read()
    .withSpannerConfig(spannerConfig)
    .withQuery("SELECT e.name,d.name FROM emp as e, department as d WHERE e.dept = d.dept;"))
.apply(ParDo.of(new DoFn<Struct,Struct>(){
    private static final long serialVersionUID = 1L;
    @ProcessElement
    public void processElement(ProcessContext c)
    {
          System.out.println(c.element().toString());
    }
 }));

我尝试了查询执行计划但不确定在Spanner UI /控制台上同样的工作正常时预期到底是什么。

2 个答案:

答案 0 :(得分:1)

今天,Cloud Dataflow连接器仅支持SQL查询,其中查询执行计划中的第一个运算符是Distributed Union。请关注https://cloud.google.com/spanner/docs/dataflow-connector#troubleshooting_unsupported_queries以获取更多信息。

在下面的Apache Beam 2.5.0版本中,可以使用SpannerIO.read().withBatching(false)禁用批处理,详见https://issues.apache.org/jira/browse/BEAM-3973

答案 1 :(得分:0)

默认情况下,SpannerIO使用Google Cloud Spanner的批处理API(https://batch-spanner.googleapis.com/)。批处理API尝试将您的查询分区为可以并行获取的多个部分,但您的查询不支持此操作。您应该尝试通过调用SpannerConfig#setHost("https://spanner.googleapis.com")

强制SpannerIO使用普通的Spanner API