当前位置: 首页 > 知识库问答 >
问题:

是否Elasticsearch chIO为apache束java支持模板和ValueProvider参数?调用模板时出错

阎知
2023-03-14

我试图创建一个模板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();
    }

我运行时遇到的错误是

共有1个答案

郎俊雅
2023-03-14

简单地说,不,它看起来不像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?