如何从包含Option类型的Scala案例类中创建NULLable Flink表列

时间:2018-10-25 20:44:40

标签: scala apache-flink

我想从包含DataSet值的案例类集合中创建一个DataStream(或Option)。 在创建的表中,由Option值得出的列应包含NULL或实际的原始值。

这是我尝试过的:

import org.apache.flink.api.scala.ExecutionEnvironment
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.TableEnvironment
import org.apache.flink.table.api.scala._
import org.apache.flink.types.Row

object OptionExample {
  case class Event(time: Timestamp, id: String, value: Option[Int])

  def main(args: Array[String]): Unit = {
    val env = ExecutionEnvironment.getExecutionEnvironment
    val tEnv = TableEnvironment.getTableEnvironment(env)

    val data = env.fromCollection(Seq(
      Event(Timestamp.valueOf("2018-01-01 00:01:00"), "a", Some(3)),
      Event(Timestamp.valueOf("2018-01-01 00:03:00"), "a", None),
      Event(Timestamp.valueOf("2018-01-01 00:03:00"), "b", Some(7)),
      Event(Timestamp.valueOf("2018-01-01 00:02:00"), "a", Some(5))
    ))

    val table = tEnv.fromDataSet(data)
    table.printSchema()
//    root
//    |-- time: Timestamp
//    |-- id: String
//    |-- value: Option[Integer]

    val result = table
      .groupBy('id)
      .select('id, 'value.avg as 'averageValue)

    // Print results
    val ds: DataSet[Row] = result.toDataSet
    ds.print()
  }
}

但这会导致聚合部分出现异常...

  

org.apache.flink.table.api.ValidationException:输入检查表达式avg('value)失败:avg需要数字类型,请在此处获取Option [Integer]

...因此,使用这种方法Option不会如上所述转换为带有NULL的数字类型。

如何通过Flink实现这一目标?

(我来自Apache Spark,通过用Options的case类创建的数据集具有这种行为。我想用Flink实现类似的功能)

0 个答案:

没有答案