我在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 /控制台上同样的工作正常时预期到底是什么。
答案 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")