[英]How to pass Runtime query to SqlTransform in apache beam?
[英]Apache Beam: IllegalStateException - Value only available at runtime after upgrading to beam 2.41.0
我将 Apache Beam 版本从 2.34.0 升级到 2.41.0,并在尝试构建模板时出现以下错误。
错误:
Exception in thread "main" java.lang.IllegalStateException: Value only available at runtime, but accessed from a non-runtime context: RuntimeValueProvider{propertyName=spannerInstanceId, default=defaultinstanceid}
at org.apache.beam.sdk.options.ValueProvider$RuntimeValueProvider.get(ValueProvider.java:254)
at org.apache.beam.sdk.io.gcp.spanner.SpannerConfig.withInstanceId(SpannerConfig.java:165)
at .... my code constructing SpannerConfig ...
我的代码如下所示:
private static SpannerConfig getValidatedSpannerConfig(MyCustomOptions options) {
SpannerConfig spannerConfig =
SpannerConfig.create()
.withProjectId(options.getSpannerProjectId())
.withInstanceId(options.getSpannerInstanceId())
.withDatabaseId(options.getSpannerDatabaseId());
spannerConfig.validate();
return spannerConfig;
}
使用 Beam 版本 <= 2.39.0
解决该问题。
似乎 SpannerConfig withInstanceId
方法通过提前调用get()
导致此运行时读取。
org.apache.beam:beam-sdks-java-io-google-cloud-platform
的 2.40.0 和 2.41.0 版本中是否有可能存在错误?
2.41.0的反编译版本是:
public SpannerConfig withInstanceId(ValueProvider<String> instanceId) {
Preconditions.checkNotNull(instanceId);
Preconditions.checkNotNull(instanceId.get()); // <<<<<< The problematic line
return toBuilder().setInstanceId(instanceId).build();
}
2.39.0的反编译版本是:
public SpannerConfig withInstanceId(ValueProvider<String> instanceId) {
return toBuilder().setInstanceId(instanceId).build();
}
我相信那里有一个错误,在 2.40.0 中引入,当它还不能访问时,它会尝试读取一个值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.