Java Apache beam PubSubIO写入

Java Apache beam PubSubIO写入,java,java-8,apache-beam,Java,Java 8,Apache Beam,无法使用Apache Beam JavaSDK写入PubSub 我试图使用beam从PubSub读取数据,进行处理,然后将数据写入PubSub主题,但我找不到如何写入PubSub主题的工作示例 是否有人可以帮助进行适当的转换,以编写PubSub主题 .apply("Create pubsub messages", ParDo.of(new DoFn<String, PubsubMessage>() { @DoFn.ProcessElement public void

无法使用Apache Beam JavaSDK写入PubSub

我试图使用beam从PubSub读取数据,进行处理,然后将数据写入PubSub主题,但我找不到如何写入PubSub主题的工作示例

是否有人可以帮助进行适当的转换,以编写PubSub主题

.apply("Create pubsub messages", ParDo.of(new DoFn<String, PubsubMessage>() {
    @DoFn.ProcessElement
    public void processElement(ProcessContext c) throws Exception {
        PubsubMessage pubsubMessage = new PubsubMessage(c.element());
        c.output(pubsubMessage);
    }
  }))
.apply("Write messages to topic",PubsubIO.writeMessages().to("projects/project_id/topics/topic_name"))
.apply(“创建pubsub消息”),ParDo.of(new DoFn(){
@DoFn.ProcessElement
public void processElement(ProcessContext c)引发异常{
PubsubMessage PubsubMessage=新的PubsubMessage(c.element());
c、 输出(pubsubMessage);
}
}))
.apply(“将消息写入主题”,PubsubIO.writeMessages()。应用于(“项目/项目id/主题/主题名称”))
我当前遇到编译错误

[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /home/username/src/main/java/com/domain/JavaClass.java:[336,1] no suitable method found for apply(java.lang.String,org.apache.beam.sdk.transforms.ParDo.SingleOutput<java.lang.String,org.apache.beam.sdk.io.gcp.pubsub.PubsubMessage>)
    method org.apache.beam.sdk.values.PCollection.<OutputT>apply(org.apache.beam.sdk.transforms.PTransform<? super org.apache.beam.sdk.values.PCollection<org.apache.beam.sdk.values.KV<java.lang.String,java.lang.Integer>>,OutputT>) is not applicable
      (cannot infer type-variable(s) OutputT
        (actual and formal argument lists differ in length))
    method org.apache.beam.sdk.values.PCollection.<OutputT>apply(java.lang.String,org.apache.beam.sdk.transforms.PTransform<? super org.apache.beam.sdk.values.PCollection<org.apache.beam.sdk.values.KV<java.lang.String,java.lang.Integer>>,OutputT>) is not applicable
      (inference variable InputT has incompatible bounds
        equality constraints: java.lang.String
        lower bounds: org.apache.beam.sdk.values.KV<java.lang.String,java.lang.Integer>)
[ERROR] /home/username//src/main/java/com/domain/JavaClass.java:[339,39] constructor PubsubMessage in class org.apache.beam.sdk.io.gcp.pubsub.PubsubMessage cannot be applied to given types;
  required: byte[],java.util.Map<java.lang.String,java.lang.String>
  found: java.lang.String
  reason: actual and formal argument lists differ in length
[ERROR]编译错误:
[信息]-------------------------------------------------------------
[错误]/home/username/src/main/java/com/domain/JavaClass.java:[336,1]未找到适用的方法(java.lang.String、org.apache.beam.sdk.transforms.ParDo.SingleOutput)

方法org.apache.beam.sdk.values.PCollection.apply(org.apache.beam.sdk.transforms.PTransform以下是从GCS读取并在发布/订阅上写入的示例:

package ...

import java.io.IOException;

import org.apache.beam.runners.dataflow.options.DataflowPipelineOptions;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.PipelineResult;
import org.apache.beam.sdk.io.TextIO;
import org.apache.beam.sdk.io.gcp.pubsub.PubsubIO;
import org.apache.beam.sdk.options.Default;
import org.apache.beam.sdk.options.Description;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
import org.apache.beam.sdk.values.PCollection;

public class Gcs2PubSub {

    public interface Pubsub2DatastoreOptions extends DataflowPipelineOptions {
        @Description("GCP project name")
        @Default.String("gcp_project_name")
        String getProjectId();
        void setProjectId(String value);
    }

    public static void main(String[] args) throws IOException {

        Pubsub2DatastoreOptions options = PipelineOptionsFactory.fromArgs(args).withValidation()
                .as(Pubsub2DatastoreOptions.class);

        Pipeline p = Pipeline.create(options);

        PCollection<String> line = p.apply("Read GCS",TextIO.read().from("gs://<bucket>/*"));
        line.apply("Sending Pub/sub",PubsubIO.writeStrings().to("<topic>"));

        PipelineResult result = p.run();
        try {
            result.waitUntilFinish();
        } catch (Exception exc) {
            result.cancel();
        }
    }
}
包。。。
导入java.io.IOException;
导入org.apache.beam.runners.dataflow.options.DataflowPipelineOptions;
导入org.apache.beam.sdk.Pipeline;
导入org.apache.beam.sdk.PipelineResult;
导入org.apache.beam.sdk.io.TextIO;
导入org.apache.beam.sdk.io.gcp.pubsub.PubsubIO;
导入org.apache.beam.sdk.options.Default;
导入org.apache.beam.sdk.options.Description;
导入org.apache.beam.sdk.options.pipelineoptions工厂;
导入org.apache.beam.sdk.values.PCollection;
公共类Gcs2PubSub{
公共接口Pubsub2DatastoreOptions扩展了DataflowPipelineOptions{
@说明(“GCP项目名称”)
@Default.String(“gcp\U项目名称”)
字符串getProjectId();
void setProjectId(字符串值);
}
公共静态void main(字符串[]args)引发IOException{
Pubsub2DatastoreOptions=PipelineOptionsFactory.fromArgs(args).withValidation()
.as(Pubsub2DatastoreOptions.class);
Pipeline p=Pipeline.create(选项);
PCollection line=p.apply(“读取GCS”,TextIO.Read()。from(“gs://*”));
行。apply(“发送发布/订阅”,PubsubIO.writeStrings())到(“”);
PipelineResult=p.run();
试一试{
result.waitUntilFinish();
}捕获(异常exc){
result.cancel();
}
}
}

请编辑您的问题,解释您所包含的代码片段中有什么不适用于您。您能否在此sinpet之前发布管道的一部分,即您将什么样的PCollection输入到“Create pubsub messages”转换中。snipet本身看起来不错,我使用了一些非常类似的东西,效果很好。