Java Apache beam PubSubIO写入
无法使用Apache Beam JavaSDK写入PubSub 我试图使用beam从PubSub读取数据,进行处理,然后将数据写入PubSub主题,但我找不到如何写入PubSub主题的工作示例 是否有人可以帮助进行适当的转换,以编写PubSub主题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
.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本身看起来不错,我使用了一些非常类似的东西,效果很好。