首页 > 解决方案 > 如何在 Scala 中调用 FileIO.Write.via(Contextful, Contextful)

问题描述

我正在使用带有 Scala 的 Apache Beam。要为不同类型的流数据创建具有各自架构的新实例,ParquetIO.Sink我正在尝试调用.via(Contextful, Contextful). FileIO.Write但是,IntelliJ 找不到我尝试使用的重载方法并引发此错误:Cannot resolve overloaded method 'via'.

FileIO
  .writeDynamic[String, DeserializedEvent]()
  .by(new UDFs.PartitionByEventName())
  .withDestinationCoder(StringUtf8Coder.of())
  .withNumShards(numShards)
  .withNaming(new UDFs.NameFiles())
  .via(
    Contextful.fn[DeserializedEvent, GenericRecord](
      new UDFs.EventToGenericRecord() // SerializableFunction[DeserializedEvent, String]
    ),
    Contextful.fn[String, ParquetIO.Sink](
      new UDFs.SinkParquet() // SerializableFunction[String, ParquetIO.Sink]
    )
  )
  .to(path)

这里有什么问题?

谢谢

标签: javascalaapache-beamparquet

解决方案


Scala 的类型推断系统和重载解析系统不能完美地协同工作。在这种情况下,via() 函数的重载会阻止类型推断正常工作。 当方法以看似不相关的方式重载时,为什么 scala 无法编译?对问题有很好的解释。

在您的情况下,您只需要将第二个 Contextful.fn 的类型参数更改为 [String, FileIO.Sink] 以使其与所需重载的签名相匹配。


推荐阅读