Scala 如何在ApacheFlink中实现窗口功能?

Scala 如何在ApacheFlink中实现窗口功能?,scala,apache-kafka,streaming,apache-flink,Scala,Apache Kafka,Streaming,Apache Flink,各位,, 我有一个卡夫卡主题源,我用一分钟的时间把它分组。 我想在该窗口中做的是使用SQL中的窗口函数创建新列,例如我想使用 (除以)的总和(金额) 计数(用户)超过(分区) (按分区)上的行数() 我可以将数据流函数用于这些操作吗?或 如何操作kafka数据将其转换为DataTable并使用sqlQuery? 目的地是卡夫卡的另一个主题 val-stream=senv .addSource(新的FlinkKafkaConsumer[String](“flink”,新的SimpleStrin

各位,, 我有一个卡夫卡主题源,我用一分钟的时间把它分组。 我想在该窗口中做的是使用SQL中的窗口函数创建新列,例如我想使用

  • (除以)的总和(金额)
  • 计数(用户)超过(分区)
  • (按分区)上的行数()
我可以将数据流函数用于这些操作吗?

如何操作kafka数据将其转换为DataTable并使用sqlQuery?

目的地是卡夫卡的另一个主题

val-stream=senv
.addSource(新的FlinkKafkaConsumer[String](“flink”,新的SimpleStringSchema(),属性))
我试过这么做

val tableA = tableEnv.fromDataStream(stream, 'user, 'product, 'amount)
但是我得到了下面的错误

Exception in thread "main" org.apache.flink.table.api.ValidationException: Too many fields referenced from an atomic type.
测试数据

1,"beer",3
1,"beer",1
2,"beer",3
3,"diaper",4
4,"diaper",1
5,"diaper",5
6,"rubber",2
查询示例

选择
用户、产品、数量、,
计数(用户)超过(按产品划分)作为计数产品
从表中;
预期业绩

1,"beer",3,3
1,"beer",1,3
2,"beer",3,3
3,"diaper",4,3
4,"diaper",1,3
5,"diaper",5,3
6,"rubber",2,1

您需要将字符串解析为字段,然后重命名它们

val env=StreamExecutionEnvironment.getExecutionEnvironment
val tEnv=StreamTableEnvironment.create(env)
val stream=env.fromElements(“1,啤酒,3”,
“1,啤酒,1”,“2,啤酒,3”,“3,尿布,4”,“4,尿布,1”,“5,尿布,5”,“6,橡胶,2”);
val parsed=stream.map(x=>{
val arr=x.split(“,”)
(arr(0).toInt,arr(1),arr(2).toInt)
})
val tableA=tEnv.fromDataStream(解析后,$“_1”作为“用户”;$“_2”作为“产品”;$“_3”作为“金额”)
//示例查询
val result=tEnv.sqlQuery(s“从$tableA中选择用户、产品、金额”)
val rs=result.toAppendStream[(Int,String,Int)]
rs.print()
我不确定如何在Flink SQL中实现所需的窗口函数。或者,它可以在简单的Flink中实现,如下所示:

parsed.keyBy(x=>x.\u 2)//按产品id设置密钥。
.window(TumblingEventTimeWindows.of(时间毫秒(2)))
.process(新的ProcessWindowFunction[
(Int,String,Int),(Int,String,Int,Int),String,TimeWindow
]() {
覆盖def进程(键:字符串,上下文:上下文,
元素:Iterable[(Int,String,Int)],
输出:收集器[(Int,String,Int,Int)]:单位={
val lst=elements.toList
lst.foreach(x=>out.collect((x._1,x._2,x._3,lst.size)))
}
})
.print()

请发布一个来自Kafka的数据示例。同时发布您想要实现的SQL查询。您的流是字符串类型,您正在尝试从中访问字段。这解释了您的异常情况。
从原子类型引用的字段太多。
您好,查询是:选择用户、产品、金额、计数(用户)超过(按产品划分)作为表中的count_product;如何应用该方案以便将其转换为表?谢谢!我使用了DataStream(解析为'user',product',amount)
flink_streaming_scala_2.11
的语法,该库包含:
StreamExecutionEnvironment
类。“重写def进程()”使我出错,告诉我方法“进程”不覆盖任何内容当您删除
进程
方法时会发生什么?问题是什么?