Python 如何将CSV作为流表源加载到PyFlink中?

Python 如何将CSV作为流表源加载到PyFlink中?,python,apache-flink,flink-streaming,pyflink,Python,Apache Flink,Flink Streaming,Pyflink,我正在尝试设置一个简单的游乐场环境来使用Flink Python表API。我最终试图写的作业将来自卡夫卡或肯尼斯队列,但这使得玩弄想法(和测试)非常困难 我可以愉快地从CSV加载并以批处理模式处理它。但我无法让它在流模式下工作。我将如何在StreamingExecutionEnvironment中做类似的事情(主要是为了让我可以使用windows) 我知道我需要让系统使用EventTime(因为ProcTime会一次全部进入),但我找不到任何方法来设置它。原则上,我应该能够将CSV中的一列设置为

我正在尝试设置一个简单的游乐场环境来使用Flink Python表API。我最终试图写的作业将来自卡夫卡或肯尼斯队列,但这使得玩弄想法(和测试)非常困难

我可以愉快地从CSV加载并以批处理模式处理它。但我无法让它在流模式下工作。我将如何在StreamingExecutionEnvironment中做类似的事情(主要是为了让我可以使用windows)

我知道我需要让系统使用EventTime(因为ProcTime会一次全部进入),但我找不到任何方法来设置它。原则上,我应该能够将CSV中的一列设置为事件时间,但文档中不清楚如何设置(或者如果可能)

为了运行批处理执行测试,我使用了下面的代码,它从
input.csv
读取,并输出到
output.csv

从pyflink.dataset导入ExecutionEnvironment
从pyflink.datastream导入StreamExecutionEnvironment
从pyflink.table导入(
TableConfig,
数据类型,
可编程环境,
河流环境,
)
从pyflink.table.descriptor导入模式、Csv、OldCsv和文件系统
从pathlib导入路径
exec\u env=ExecutionEnvironment.get\u execution\u environment()
执行环境设置并行(1)
t_config=TableConfig()
t_env=BatchTableEnvironment.create(exec_env,t_config)
root=Path(_u文件)。parent.resolve()
out\u path=root/“output.csv”
尝试:
out_path.unlink()
除:
通过
从pyflink.table.window导入翻滚
(
t_env.connect(FileSystem().path(str(root/“input.csv”))
.使用_格式(Csv())
.使用_模式(
Schema().field(“time”,DataTypes.TIMESTAMP(3)).field(“word”,DataTypes.STRING())
)
.创建临时表格(“mySource”)
)
(
t_env.connect(FileSystem().path(str(out_path)))
.使用_格式(Csv())
.使用_模式(
Schema().field(“word”,DataTypes.STRING()).field(“count”,DataTypes.BIGINT())
)
.创建临时表格(“mySink”)
)
(
来自路径的环境(“mySource”)
.分组人(“word”)
.选择(“单词,计数(1)作为计数”)
.过滤器(“计数>1”)
.将_插入(“我的链接”)
)
环境执行(“教程作业”)
而input.csv是

2000-01-01 00:00:00.000000000,james
2000-01-01 00:00:00.000000000,james
2002-01-01 00:00:00.000000000,steve
因此,我的问题是如何设置它,使其从相同的CSV读取,但使用第一列作为事件时间,并允许我编写如下代码:

(
来自路径的环境(“mySource”)
.窗口(翻滚(“10分钟”)。打开(“时间”)。别名(“w”))
.分组人(“w,word”)
.选择(“w,word,count(1)作为count”)
.过滤器(“计数>1”)
.将_插入(“我的链接”)
)

任何帮助都将不胜感激,我无法从文件中解决这个问题。我使用的是
python3.7
flink1.11.1

您尝试过使用水印策略吗?如前所述,您需要使用水印策略来使用事件时间。对于pyflink,我个人认为用ddl格式声明它更容易,如。

如果使用描述符API,可以通过模式指定一个字段为事件时间字段:

.with_schema(  # declare the schema of the table
             Schema()
             .field("rowtime", DataTypes.TIMESTAMP())
             .rowtime(
                Rowtime()
                .timestamps_from_field("time")
                .watermarks_periodic_bounded(60000))
             .field("a", DataTypes.STRING())
             .field("b", DataTypes.STRING())
             .field("c", DataTypes.STRING())
         )
但我仍然建议您使用,一方面它更易于使用,另一方面现有的描述符API中存在一些bug,社区正在讨论重构描述符API