【问题标题】:Java Apache Beam Testing pipeline replaces test data with null valuesJava Apache Beam 测试管道将测试数据替换为空值
【发布时间】:2021-11-12 09:34:53
【问题描述】:

我已经创建了一个这样的测试管道:

        Pipeline pipeline;
        PipelineOptions pipelineOptions = TestPipeline.testingPipelineOptions();
        pipeline = Pipeline.create(pipelineOptions);

        FlattenLight flattenLight = new FlattenLight();
        DataflowMessage dataflowMessage = getTestDataflowMessage();
        
        PCollection<TableRow> flatttened = pipeline
                .apply("Create Input", Create.of(dataflowMessage))
                .apply(ParDo.of(flattenLight));

我想测试 FlattenLight 类,它是一个带有 processElement(ProcessContext c) 方法的 DoFn 子类。

问题是使用getTestDataflowMessage() 生成的测试数据没有通过管道。 FlattenLight 对象接收一个具有空值作为字段的对象。

getTestDataflowMessage() 按预期创建字段。您可以看到存在许多不同的测试值:

debugger step at test data creation

但是 FlattenLight 类接收到的 Object 大部分是空的:

debugger step entering the FlattenLight object

如您所见,数据创建和 FlattenLight 处理之间没有步骤。为什么会发生这种情况?如何解决?

【问题讨论】:

  • DataflowMessage 使用的是什么编码器?
  • @robertwb 我没有使用。有必要吗?
  • 我的猜测是 DataflowMessage 不知何故没有正确序列化。它的定义是什么?

标签: java testing apache-beam


【解决方案1】:

我有同样的问题。解决方案是将implements Serializable 添加到模型层次结构中的所有模型。仔细看看你的 DataflowMessage,也许你在某个地方漏掉了它。

【讨论】:

  • 这将导致使用SerializableCoder。这是一个很好的开始。然后您可能需要更有效的编码,您可以将@DefaultCoder 注释应用于DataflowMessage 类以将其编码为例如Avro 或 Beam Row 格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多