我试图创建一个模板Apache束索引数据到elasticsearch。正在创建模板,但是在调用模板时管道失败,没有协议错误。看起来很奇怪,因为错误与URL对象有关。
public class StarterPipeline {
private static final Logger LOG = LoggerFactory.getLogger(StarterPipeline.class);
public interface IndexToEsOptions extends PipelineOptions {
@Description("Path of the gzip index file to read from")
ValueProvider<String> getInputIndexFile();
void setInputIndexFile(ValueProvider<String> value);
@Description("Index name to index with")
ValueProvider<String> getIndexName();
void setIndexName(ValueProvider<String> value);
@Description("Index template name")
ValueProvider<String> getIndexTemplate();
void setIndexTemplate(ValueProvider<String> value);
@Description("URI for es")
@Default.String("https://vpc-myescore01-5mtib6vgjw7sbhgn3kbnwnluim.us-west-1.es.amazonaws.com")
ValueProvider<String> getEsUri();
void setEsUri(ValueProvider<String> value);
}
public static void main(String[] args) {
IndexToEsOptions options = PipelineOptionsFactory
.fromArgs(args).
withValidation().as(IndexToEsOptions.class);
Pipeline p = Pipeline.create(options);
p.apply(TextIO.read().from(options.getInputIndexFile()))
.apply(ElasticsearchIO.write().withConnectionConfiguration(
ElasticsearchIO.ConnectionConfiguration.create(
new String[]{options.getEsUri().toString()},
options.getIndexName().toString(),
options.getIndexTemplate().toString())
.withConnectTimeout(240)
)
.withMaxBatchSizeBytes(15 * 1024 * 1024)
);
p.run();
}
我运行时遇到的错误是
简单地说,不,它看起来不像ElasticsearchIO。ConnectionConfiguration支持ValueProviders,至少在当前版本(2.22.0)中不支持。通过查看ConnectionConfiguration的签名可以看到这一点。创建
:
public static ElasticsearchIO.ConnectionConfiguration create(java.lang.String[] addresses,
java.lang.String index,
java.lang.String type)
并将其与支持ValueProviders的函数进行比较,ElasticsearchIO。阅读withQuery
:
public ElasticsearchIO.Read withQuery(ValueProvider<java.lang.String> query)
要支持ValueProviders,函数必须实际接受ValueProvider对象。这是因为ValueProvider打算在运行时而不是在管道构建期间通信参数。因此,在管道构建期间,它必须作为ValueProvider对象到处传递。
在您的示例中,您正在调用EsUri
的ValueProvider上的toString
,而不是生成包含URL的字符串,而是得到ValueProvider的字符串表示形式,如下所示:“RuntimeValueProvider{propertyName=EsUri,默认值=https://vpc-esprdcore01-5mtib6vgjw7sbhgn3kbnwnluim.us-east-1.es.amazonaws.com}
。这就是为什么会出现格式错误的异常异常
。它试图将该字符串作为URL读取,但失败。
解决方案很简单,您只需要将EsUri
参数更改为构建时间参数,方法是从ValueProvider更改
假设我有一个类模板,
在这种情况下,我总是希望从第一个参数中推导出来,但看起来我没有很好地表达这一点。的类型是,因此: 有没有一种方法可以声明,这样第二个参数就不参与模板参数的推导了?
我试图在类型s. t上专门化一个类。它忽略了给定类型的恒定性。在这种情况下,该类型是一个模板模板参数: 上面的代码在GCC 4.8.4和clang 5.0(with-std=c 11)中都抱怨bar在与匹配FOFType模板参数化的类一起使用时未定义。即使我删除了sfinae参数,仍然无法找到特化。 这个问题的一个例子可以在这里找到:https://godbolt.org/g/Cjci9C.在上面
另一个有用的可能示例:(伪代码)
在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模板 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号...: template<ty
考虑以下示例: 我的GCC 9.2.0无法编译并出现以下错误: 但是,工作正常。为什么会这样?如何使用显式模板参数调用foo?