【问题标题】:com.google.cloud.dataflow.sdk.coders.CoderException: cannot encode a null Stringcom.google.cloud.dataflow.sdk.coders.CoderException:无法编码空字符串
【发布时间】:2016-06-15 21:59:56
【问题描述】:

我在 Google Cloud Data Flow 中收到以下错误:

java.lang.RuntimeException: com.google.cloud.dataflow.sdk.util.UserCodeException: java.lang.RuntimeException: com.google.cloud.dataflow.sdk.util.UserCodeException: java.lang.RuntimeException: com .google.cloud.dataflow.sdk.util.UserCodeException:java.lang.RuntimeException:java.lang.RuntimeException:com.google.cloud.dataflow.sdk.util.UserCodeException:java.lang.RuntimeException:java.lang.RuntimeException :com.google.cloud.dataflow.sdk.coders.CoderException:无法在 com.google.cloud.dataflow.sdk.runners.worker.SimpleParDoFn$1.output(SimpleParDoFn.java:162) 处编码空字符串 com.google.cloud.dataflow.sdk.util.DoFnRunnerBase$DoFnContext.outputWindowedValue(DoFnRunnerBase.java:287) 在 com.google.cloud.dataflow.sdk.util.DoFnRunnerBase$DoFnProcessContext.output(DoFnRunnerBase.java:449) 在 报告.transforms.JsonToObject.processElement(JsonToObject.java:35)

原因:com.google.cloud.dataflow.sdk.util.UserCodeException:java.lang.RuntimeException:com.google.cloud.dataflow.sdk.util.UserCodeException:java.lang.RuntimeException:com.google。 cloud.dataflow.sdk.util.UserCodeException: java.lang.RuntimeException: java.lang.RuntimeException: com.google.cloud.dataflow.sdk.util.UserCodeException: java.lang.RuntimeException: java.lang.RuntimeException: com. google.cloud.dataflow.sdk.coders.CoderException:无法在 com.google.cloud.dataflow.sdk.util.UserCodeException.wrap(UserCodeException.java:35) 在 com.google.cloud.dataflow.sdk 编码空字符串.util.UserCodeException.wrapIf(UserCodeException.java:40) 在 com.google.cloud.dataflow.sdk.util.DoFnRunnerBase.wrapUserCodeException(DoFnRunnerBase.java:368) 在 com.google.cloud.dataflow.sdk.util.SimpleDoFnRunner .invokeProcessElement(SimpleDoFnRunner.java:51) 在 com.google.cloud.dataflow.sdk.util.DoFnRunnerBase.processElement(DoFnRunnerBase.java:138) 在 com.google.cloud.dataflow.sdk.runners.worker。 SimpleParDoFn.processElement(SimpleParDoFn.java:190) 在 com.google.cloud.dataflow.sdk.runners.worker.ForwardingParDoFn.processElement(ForwardingParDoFn.java:42) 在 com.google.cloud.dataflow.sdk.runners.worker。 DataflowWorkerLoggingParDoFn.processElement(DataflowWorkerLoggingParDoFn.java:47) 在 com.google.cloud.dataflow.sdk.util.common.worker.ParDoOperation.process(ParDoOperation.java:53) 在 com.google.cloud.dataflow.sdk.util.common.worker.OutputReceiver.process(OutputReceiver.java:52) 在 com.google.cloud.dataflow.sdk.runners.worker.SimpleParDoFn$1.output(SimpleParDoFn.java:160) 在 com.google.cloud.dataflow.sdk.util.DoFnRunnerBase$DoFnContext.outputWindowedValue(DoFnRunnerBase.java:287) 在 com.google.cloud.dataflow.sdk.util.DoFnRunnerBase$DoFnProcessContext.output(DoFnRunnerBase.java:449) 在 报告.transforms.JsonToObject.processElement(JsonToObject.java:35) 在 com.google.cloud.dataflow.sdk.util.SimpleDoFnRunner.invokeProcessElement(SimpleDoFnRunner.java:49) 在 com.google.cloud.dataflow.sdk.util.DoFnRunnerBase.processElement(DoFnRunnerBase.java:138)

在我的班级 (JsonToObject) 中,我执行以下操作:

如果 (obj != null) { processContext.output(obj); }

以及引发异常的地方。

知道为什么会这样吗?

【问题讨论】:

  • 看起来您的编码器很可能是复合编码器,并且您的对象中某处有一个空字符串。你是如何设置编码器的?此外,如果您自己构建编码器,NullableCoder 可能会有用
  • 我使用的是默认编码器,不是自己设置的。但是是的,我的对象有可以为空的字符串成员,为什么会出现问题?
  • NullableCoder 不能设置为默认解码器?我收到以下错误 java.lang.IllegalArgumentException: Class com.google.cloud.dataflow.sdk.coders.NullableCoder is missing required static method of (TypeDescriptor)。

标签: google-cloud-dataflow


【解决方案1】:

NullableCoder 是一个复合编码器,需要根据另一个编码器来指定它。 @DefaultCoder 与复合编码器(KvCoder、IterableCoder、...)不兼容,因为此要求由另一个编码器参数化。解决问题的一种方法是在每个可能包含可为空类型的 PCollection 上手动设置编码器。例如:

PCollection<String> pc = pipeline.apply(... transform that produces nulls ...);
pc.setCoder(NullableCoder.of(StringUtf8Coder.of());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2014-12-24
    • 2015-12-16
    相关资源
    最近更新 更多