我想从包含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实现类似的功能)