{"id":47010,"date":"2023-07-31T10:22:58","date_gmt":"2024-01-19T12:03:44","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/"},"modified":"2024-04-30T16:15:46","modified_gmt":"2024-04-30T08:15:46","slug":"%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/","title":{"rendered":"\u4f7f\u7528Apache Flink\u548cJava 8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408"},"content":{"rendered":"<p>\u6211\u4f7f\u7528Apache Flink\u548cScala API\u5c1d\u8bd5\u4e86SensorTag\u7684\u4f20\u611f\u5668\u6570\u636e\u7684\u7a97\u53e3\u805a\u5408\u3002\u6211\u5c06\u5c3d\u91cf\u4f7f\u7528Java 8 API\u6765\u91cd\u65b0\u7f16\u5199Scala API\u3002<\/p>\n<h2>Maven\u539f\u578b<\/h2>\n<p>\u4f7f\u7528Java API\u4e2d\u7684\u793a\u4f8b\u9879\u76ee\u6765\u521b\u5efa\u4e00\u4e2aMaven\u9879\u76ee\uff0c\u4f7f\u7528flink-quickstart-java\u3002Apache Flink\u7684\u7248\u672c\u548c\u4e4b\u524d\u7684Scala\u7248\u672c\u76f8\u540c\uff0c\u4e3a1.3.2\u3002\u8bf7\u6839\u636e\u60a8\u7684\u73af\u5883\u66f4\u6539groupId\u548cpackage\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">mkdir<\/span> <span class=\"nt\">-p<\/span> ~\/java_apps <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">cd<\/span> ~\/java_apps\r\n<span class=\"nv\">$ <\/span>mvn archetype:generate <span class=\"se\">\\<\/span>\r\n    <span class=\"nt\">-DarchetypeGroupId<\/span><span class=\"o\">=<\/span>org.apache.flink <span class=\"se\">\\<\/span>\r\n    <span class=\"nt\">-DarchetypeArtifactId<\/span><span class=\"o\">=<\/span>flink-quickstart-java <span class=\"se\">\\<\/span>\r\n    <span class=\"nt\">-DarchetypeVersion<\/span><span class=\"o\">=<\/span>1.3.2 <span class=\"se\">\\<\/span>\r\n    <span class=\"nt\">-DgroupId<\/span><span class=\"o\">=<\/span>streams-flink-java-examples <span class=\"se\">\\<\/span>\r\n    <span class=\"nt\">-DartifactId<\/span><span class=\"o\">=<\/span>streams-flink-java-examples <span class=\"se\">\\<\/span>\r\n    <span class=\"nt\">-Dversion<\/span><span class=\"o\">=<\/span>0.1 <span class=\"se\">\\<\/span>\r\n    <span class=\"nt\">-Dpackage<\/span><span class=\"o\">=<\/span>com.github.masato.streams.flink <span class=\"se\">\\<\/span>\r\n    <span class=\"nt\">-DinteractiveMode<\/span><span class=\"o\">=<\/span><span class=\"nb\">false<\/span>\r\n<\/code><\/pre>\n<p>\u5c06maven-compiler-plugin\u63d2\u4ef6\u7684\u8bbe\u7f6e\u66f4\u6539\u4e3aJava 8 (1.8)\u3002\u5e76\u6dfb\u52a0exec-maven-plugin\u63d2\u4ef6\u4ee5\u4f7f\u5f97\u80fd\u591f\u4eceMaven\u4e2d\u6267\u884cFlink\u5e94\u7528\u7a0b\u5e8f\u7684main()\u65b9\u6cd5\u3002<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"nt\">&lt;build&gt;<\/span>\r\n        <span class=\"nt\">&lt;plugins&gt;<\/span>\r\n...\r\n              <span class=\"nt\">&lt;plugin&gt;<\/span>\r\n                <span class=\"nt\">&lt;groupId&gt;<\/span>org.apache.maven.plugins<span class=\"nt\">&lt;\/groupId&gt;<\/span>\r\n                <span class=\"nt\">&lt;artifactId&gt;<\/span>maven-compiler-plugin<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\r\n                <span class=\"nt\">&lt;version&gt;<\/span>3.1<span class=\"nt\">&lt;\/version&gt;<\/span>\r\n                <span class=\"nt\">&lt;configuration&gt;<\/span>\r\n                  <span class=\"nt\">&lt;source&gt;<\/span>1.8<span class=\"nt\">&lt;\/source&gt;<\/span>\r\n                  <span class=\"nt\">&lt;target&gt;<\/span>1.8<span class=\"nt\">&lt;\/target&gt;<\/span>\r\n                <span class=\"nt\">&lt;\/configuration&gt;<\/span>\r\n              <span class=\"nt\">&lt;\/plugin&gt;<\/span>\r\n\r\n              <span class=\"nt\">&lt;plugin&gt;<\/span>\r\n                <span class=\"nt\">&lt;groupId&gt;<\/span>org.codehaus.mojo<span class=\"nt\">&lt;\/groupId&gt;<\/span>\r\n                <span class=\"nt\">&lt;artifactId&gt;<\/span>exec-maven-plugin<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\r\n                <span class=\"nt\">&lt;version&gt;<\/span>1.5.0<span class=\"nt\">&lt;\/version&gt;<\/span>\r\n                <span class=\"nt\">&lt;executions&gt;<\/span>\r\n                  <span class=\"nt\">&lt;execution&gt;<\/span>\r\n                    <span class=\"nt\">&lt;id&gt;<\/span>App<span class=\"nt\">&lt;\/id&gt;<\/span>\r\n                    <span class=\"nt\">&lt;goals&gt;<\/span>\r\n                      <span class=\"nt\">&lt;goal&gt;<\/span>exec<span class=\"nt\">&lt;\/goal&gt;<\/span>\r\n                    <span class=\"nt\">&lt;\/goals&gt;<\/span>\r\n                  <span class=\"nt\">&lt;\/execution&gt;<\/span>\r\n                <span class=\"nt\">&lt;\/executions&gt;<\/span>\r\n                <span class=\"nt\">&lt;configuration&gt;<\/span>\r\n                  <span class=\"nt\">&lt;executable&gt;<\/span>java<span class=\"nt\">&lt;\/executable&gt;<\/span>\r\n                  <span class=\"nt\">&lt;classpathScope&gt;<\/span>compile<span class=\"nt\">&lt;\/classpathScope&gt;<\/span>\r\n                  <span class=\"nt\">&lt;arguments&gt;<\/span>\r\n                    <span class=\"nt\">&lt;argument&gt;<\/span>-cp<span class=\"nt\">&lt;\/argument&gt;<\/span>\r\n                    <span class=\"nt\">&lt;classpath\/&gt;<\/span>\r\n                    <span class=\"nt\">&lt;argument&gt;<\/span>com.github.masato.streams.flink.WordCount<span class=\"nt\">&lt;\/argument&gt;<\/span>\r\n                  <span class=\"nt\">&lt;\/arguments&gt;<\/span>\r\n                <span class=\"nt\">&lt;\/configuration&gt;<\/span>\r\n              <span class=\"nt\">&lt;\/plugin&gt;<\/span>\r\n<\/code><\/pre>\n<p>\u6267\u884c\u6267\u884c\u76ee\u6807\u3002WordCount\u793a\u4f8b\u5c06\u7edf\u8ba1\u6587\u672c\u4e2d\u7684\u5355\u8bcd\u5e76\u8f93\u51fa\u5230\u6807\u51c6\u8f93\u51fa\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>mvn clean package <span class=\"nb\">exec<\/span>:exec@App\r\n...\r\n<span class=\"o\">(<\/span>is,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>a,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span><span class=\"k\">in<\/span>,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>mind,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>or,2<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>against,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>arms,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>not,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>sea,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>the,3<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>troubles,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>fortune,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>take,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>to,4<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>and,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>arrows,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>be,2<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>nobler,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>of,2<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>slings,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>suffer,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>outrageous,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>tis,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>whether,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>question,1<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>that,1<span class=\"o\">)<\/span>\r\n<\/code><\/pre>\n<h2>\u7a97\u53e3\u6c47\u603b (su\u01d2)<br \/>\nNote: &#8220;\u30a6\u30a3\u30f3\u30c9\u30a6\u96c6\u8a08&#8221; means &#8220;window aggregation&#8221; in Japanese. The Chinese equivalent is &#8220;\u7a97\u53e3\u6c47\u603b.&#8221;<\/h2>\n<p>\u5148\u5220\u9664flink-quickstart-java\u539f\u578b\u521b\u5efa\u7684\u6240\u6709Java\u4ee3\u7801\uff0c\u7136\u540e\u7f16\u5199\u65b0\u7684\u4ee3\u7801\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">rm <\/span>src\/main\/java\/com\/github\/masato\/streams\/flink\/<span class=\"k\">*<\/span>.java\r\n<\/code><\/pre>\n<p>\u6e90\u4ee3\u7801\u4e5f\u53ef\u4ee5\u5728\u5b58\u50a8\u5e93\u4e2d\u627e\u5230\u3002\u4f7f\u7528Scala\u7f16\u5199\u7684\u4f8b\u5b50\u662f\u5728\u4e00\u4e2a\u6587\u4ef6\u4e2d\uff0c\u4f46\u662f\u4e3a\u4e86\u65b9\u4fbf\u7406\u89e3\uff0cJava\u7684\u60c5\u51b5\u4e0b\u6211\u4eec\u5c06\u5176\u5206\u4e3a\u4e86\u591a\u4e2a\u7c7b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>tree streams-flink-java-examples\r\nstreams-flink-java-examples\r\n\u251c\u2500\u2500 pom.xml\r\n\u2514\u2500\u2500 src\r\n    \u2514\u2500\u2500 main\r\n        \u251c\u2500\u2500 java\r\n        \u2502   \u2514\u2500\u2500 com\r\n        \u2502       \u2514\u2500\u2500 github\r\n        \u2502           \u2514\u2500\u2500 masato\r\n        \u2502               \u2514\u2500\u2500 streams\r\n        \u2502                   \u2514\u2500\u2500 flink\r\n        \u2502                       \u251c\u2500\u2500 Accumulator.java\r\n        \u2502                       \u251c\u2500\u2500 Aggregate.java\r\n        \u2502                       \u251c\u2500\u2500 App.java\r\n        \u2502                       \u251c\u2500\u2500 Average.java\r\n        \u2502                       \u2514\u2500\u2500 Sensor.java\r\n        \u2514\u2500\u2500 resources\r\n            \u2514\u2500\u2500 log4j.properties\r\n<\/code><\/pre>\n<h3>App.java\u7684\u4e2d\u6587\u7ffb\u8bd1\u53ef\u4ee5\u662f &#8220;\u5e94\u7528\u7a0b\u5e8f.java&#8221;\u3002<\/h3>\n<p>\u4ee5\u4e0b\u662f\u4e00\u4e2a\u5b9e\u73b0\u4e86\u4e3b\u65b9\u6cd5\u7684\u7a0b\u5e8f\u7684\u5b8c\u6574\u6587\u672c\u3002\u4e0e\u7528Scala\u7f16\u5199\u7684App.scala\u793a\u4f8b\u7c7b\u4f3c\uff0c\u4f46\u5c06AggregateFunction\u548cWindowFunction\u5206\u522b\u5b9a\u4e49\u4e3a\u7c7b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.github.masato.streams.flink<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.Date<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.Map<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.HashMap<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.Properties<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.time.ZoneId<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.time.ZonedDateTime<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.time.format.DateTimeFormatter<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.api.TimeCharacteristic<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.api.datastream.DataStream<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.api.environment.StreamExecutionEnvironment<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.api.functions.source.SourceFunction<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.api.windowing.time.Time<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.api.windowing.windows.TimeWindow<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer010<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer010<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.util.serialization.JSONDeserializationSchema<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.util.serialization.SimpleStringSchema<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.fasterxml.jackson.databind.ObjectMapper<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">com.fasterxml.jackson.databind.node.ObjectNode<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">App<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"nc\">DateTimeFormatter<\/span> <span class=\"n\">fmt<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">DateTimeFormatter<\/span><span class=\"o\">.<\/span><span class=\"na\">ISO_OFFSET_DATE_TIME<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">bootstrapServers<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">getenv<\/span><span class=\"o\">(<\/span><span class=\"s\">\"BOOTSTRAP_SERVERS_CONFIG\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">groupId<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">getenv<\/span><span class=\"o\">(<\/span><span class=\"s\">\"GROUP_ID\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">sourceTopic<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">getenv<\/span><span class=\"o\">(<\/span><span class=\"s\">\"SOURCE_TOPIC\"<\/span><span class=\"o\">);<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">sinkTopic<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">getenv<\/span><span class=\"o\">(<\/span><span class=\"s\">\"SINK_TOPIC\"<\/span><span class=\"o\">);<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Exception<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"kd\">final<\/span> <span class=\"nc\">Properties<\/span> <span class=\"n\">props<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Properties<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"n\">props<\/span><span class=\"o\">.<\/span><span class=\"na\">setProperty<\/span><span class=\"o\">(<\/span><span class=\"s\">\"bootstrap.servers\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">bootstrapServers<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">props<\/span><span class=\"o\">.<\/span><span class=\"na\">setProperty<\/span><span class=\"o\">(<\/span><span class=\"s\">\"group.id\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">groupId<\/span><span class=\"o\">);<\/span>\r\n\r\n        <span class=\"kd\">final<\/span> <span class=\"nc\">StreamExecutionEnvironment<\/span> <span class=\"n\">env<\/span> <span class=\"o\">=<\/span>\r\n            <span class=\"nc\">StreamExecutionEnvironment<\/span><span class=\"o\">.<\/span><span class=\"na\">getExecutionEnvironment<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"n\">env<\/span><span class=\"o\">.<\/span><span class=\"na\">setStreamTimeCharacteristic<\/span><span class=\"o\">(<\/span><span class=\"nc\">TimeCharacteristic<\/span><span class=\"o\">.<\/span><span class=\"na\">EventTime<\/span><span class=\"o\">);<\/span>\r\n\r\n        <span class=\"kd\">final<\/span> <span class=\"nc\">DataStream<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">ObjectNode<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">events<\/span> <span class=\"o\">=<\/span>\r\n                                <span class=\"n\">env<\/span><span class=\"o\">.<\/span><span class=\"na\">addSource<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">FlinkKafkaConsumer010<\/span><span class=\"o\">&lt;&gt;(<\/span>\r\n                                  <span class=\"n\">sourceTopic<\/span><span class=\"o\">,<\/span>\r\n                                  <span class=\"k\">new<\/span> <span class=\"nf\">JSONDeserializationSchema<\/span><span class=\"o\">(),<\/span>\r\n                                  <span class=\"n\">props<\/span><span class=\"o\">)).<\/span><span class=\"na\">name<\/span><span class=\"o\">(<\/span><span class=\"s\">\"events\"<\/span><span class=\"o\">);<\/span>\r\n\r\n        <span class=\"kd\">final<\/span> <span class=\"nc\">SingleOutputStreamOperator<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">ObjectNode<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">timestamped<\/span> <span class=\"o\">=<\/span>\r\n            <span class=\"n\">events<\/span>\r\n            <span class=\"o\">.<\/span><span class=\"na\">assignTimestampsAndWatermarks<\/span><span class=\"o\">(<\/span>\r\n                <span class=\"k\">new<\/span> <span class=\"nc\">BoundedOutOfOrdernessTimestampExtractor<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">ObjectNode<\/span><span class=\"o\">&gt;(<\/span><span class=\"nc\">Time<\/span><span class=\"o\">.<\/span><span class=\"na\">seconds<\/span><span class=\"o\">(<\/span><span class=\"mi\">10<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>\r\n                    <span class=\"nd\">@Override<\/span>\r\n                    <span class=\"kd\">public<\/span> <span class=\"kt\">long<\/span> <span class=\"nf\">extractTimestamp<\/span><span class=\"o\">(<\/span><span class=\"nc\">ObjectNode<\/span> <span class=\"n\">element<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n                        <span class=\"k\">return<\/span> <span class=\"n\">element<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"time\"<\/span><span class=\"o\">).<\/span><span class=\"na\">asLong<\/span><span class=\"o\">()<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">1000<\/span><span class=\"o\">;<\/span>\r\n                    <span class=\"o\">}<\/span>\r\n                <span class=\"o\">});<\/span>\r\n\r\n        <span class=\"n\">timestamped<\/span>\r\n            <span class=\"o\">.<\/span><span class=\"na\">map<\/span><span class=\"o\">((<\/span><span class=\"n\">v<\/span><span class=\"o\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\r\n                    <span class=\"nc\">String<\/span> <span class=\"n\">key<\/span> <span class=\"o\">=<\/span>  <span class=\"n\">v<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"bid\"<\/span><span class=\"o\">).<\/span><span class=\"na\">asText<\/span><span class=\"o\">();<\/span>\r\n                    <span class=\"kt\">double<\/span> <span class=\"n\">ambient<\/span> <span class=\"o\">=<\/span> <span class=\"n\">v<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"ambient\"<\/span><span class=\"o\">).<\/span><span class=\"na\">asDouble<\/span><span class=\"o\">();<\/span>\r\n                    <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">Sensor<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">,<\/span> <span class=\"n\">ambient<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"o\">})<\/span>\r\n            <span class=\"o\">.<\/span><span class=\"na\">keyBy<\/span><span class=\"o\">(<\/span><span class=\"n\">v<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">v<\/span><span class=\"o\">.<\/span><span class=\"na\">key<\/span><span class=\"o\">)<\/span>\r\n            <span class=\"o\">.<\/span><span class=\"na\">timeWindow<\/span><span class=\"o\">(<\/span><span class=\"nc\">Time<\/span><span class=\"o\">.<\/span><span class=\"na\">seconds<\/span><span class=\"o\">(<\/span><span class=\"mi\">60<\/span><span class=\"o\">))<\/span>\r\n            <span class=\"o\">.<\/span><span class=\"na\">aggregate<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">Aggregate<\/span><span class=\"o\">(),<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Average<\/span><span class=\"o\">())<\/span>\r\n            <span class=\"o\">.<\/span><span class=\"na\">map<\/span><span class=\"o\">((<\/span><span class=\"n\">v<\/span><span class=\"o\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\r\n                    <span class=\"nc\">ZonedDateTime<\/span> <span class=\"n\">zdt<\/span> <span class=\"o\">=<\/span>\r\n                        <span class=\"k\">new<\/span> <span class=\"nf\">Date<\/span><span class=\"o\">(<\/span><span class=\"n\">v<\/span><span class=\"o\">.<\/span><span class=\"na\">time<\/span><span class=\"o\">).<\/span><span class=\"na\">toInstant<\/span><span class=\"o\">().<\/span><span class=\"na\">atZone<\/span><span class=\"o\">(<\/span><span class=\"nc\">ZoneId<\/span><span class=\"o\">.<\/span><span class=\"na\">systemDefault<\/span><span class=\"o\">());<\/span>\r\n                    <span class=\"nc\">String<\/span> <span class=\"n\">time<\/span> <span class=\"o\">=<\/span> <span class=\"n\">fmt<\/span><span class=\"o\">.<\/span><span class=\"na\">format<\/span><span class=\"o\">(<\/span><span class=\"n\">zdt<\/span><span class=\"o\">);<\/span>\r\n\r\n                    <span class=\"nc\">Map<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Object<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">payload<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">HashMap<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Object<\/span><span class=\"o\">&gt;();<\/span>\r\n                    <span class=\"n\">payload<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"time\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">time<\/span><span class=\"o\">);<\/span>\r\n                    <span class=\"n\">payload<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"bid\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">v<\/span><span class=\"o\">.<\/span><span class=\"na\">bid<\/span><span class=\"o\">);<\/span>\r\n                    <span class=\"n\">payload<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"ambient\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">v<\/span><span class=\"o\">.<\/span><span class=\"na\">sum<\/span><span class=\"o\">);<\/span>\r\n\r\n                    <span class=\"nc\">String<\/span> <span class=\"n\">retval<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ObjectMapper<\/span><span class=\"o\">().<\/span><span class=\"na\">writeValueAsString<\/span><span class=\"o\">(<\/span><span class=\"n\">payload<\/span><span class=\"o\">);<\/span>\r\n                    <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">retval<\/span><span class=\"o\">);<\/span>\r\n                    <span class=\"k\">return<\/span> <span class=\"n\">retval<\/span><span class=\"o\">;<\/span>\r\n                <span class=\"o\">})<\/span>\r\n            <span class=\"o\">.<\/span><span class=\"na\">addSink<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">FlinkKafkaProducer010<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"o\">&gt;(<\/span>\r\n                         <span class=\"n\">bootstrapServers<\/span><span class=\"o\">,<\/span>\r\n                         <span class=\"n\">sinkTopic<\/span><span class=\"o\">,<\/span>\r\n                         <span class=\"k\">new<\/span> <span class=\"nf\">SimpleStringSchema<\/span><span class=\"o\">())<\/span>\r\n                     <span class=\"o\">).<\/span><span class=\"na\">name<\/span><span class=\"o\">(<\/span><span class=\"s\">\"kafka\"<\/span><span class=\"o\">);<\/span>\r\n\r\n        <span class=\"n\">env<\/span><span class=\"o\">.<\/span><span class=\"na\">execute<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u4f20\u611f\u5668.java<\/h3>\n<p>\u5728Scala\u4e2d\uff0c\u4f7f\u7528BD\u5730\u5740\u4f5c\u4e3a\u952e\u521b\u5efa\u4e86\u4e00\u4e2aScala\u5143\u7ec4\uff0c\u7528\u4e8e\u8868\u793a\u6d41\u5f0f\u4f20\u611f\u5668\u6570\u636e\u3002<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"n\">timestamped<\/span>\r\n      <span class=\"o\">.<\/span><span class=\"py\">map<\/span> <span class=\"o\">{<\/span> <span class=\"n\">v<\/span> <span class=\"k\">=&gt;<\/span>\r\n        <span class=\"k\">val<\/span> <span class=\"nv\">key<\/span> <span class=\"k\">=<\/span>  <span class=\"nv\">v<\/span><span class=\"o\">.<\/span><span class=\"py\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"bid\"<\/span><span class=\"o\">).<\/span><span class=\"py\">asText<\/span>\r\n        <span class=\"k\">val<\/span> <span class=\"nv\">ambient<\/span> <span class=\"k\">=<\/span> <span class=\"nv\">v<\/span><span class=\"o\">.<\/span><span class=\"py\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"ambient\"<\/span><span class=\"o\">).<\/span><span class=\"py\">asDouble<\/span>\r\n        <span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">,<\/span> <span class=\"n\">ambient<\/span><span class=\"o\">)<\/span>\r\n      <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5373\u4f7f\u5728Java 8\u4e2d\uff0c\u4e5f\u53ef\u4ee5\u50cfScala\u4e00\u6837\u4f7f\u7528Tuple2\u3002\u7136\u800c\uff0c\u6839\u636e\u5728\u4f7f\u7528Apache Flink\u548cJava 8\u7684\u6307\u5357\u4e2d\u6240\u8ff0\uff0c\u9700\u8981\u4f7f\u7528Eclipse JDT\u8fdb\u884c\u7f16\u8bd1\u3002\u53e6\u5916\uff0c\u5982\u679c\u4e0d\u4f7f\u7528TupleTypeInfo\u5728returns()\u4e2d\u6307\u5b9a\u5143\u7d20\u7684\u7c7b\u578b\u63d0\u793a\u4e3aJava\u7c7b\uff0c\u5c06\u4f1a\u51fa\u73b0\u9519\u8bef\u3002<\/p>\n<pre class=\"post-pre\"><code>            <span class=\"o\">.<\/span><span class=\"na\">map<\/span><span class=\"o\">((<\/span><span class=\"n\">v<\/span><span class=\"o\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\r\n                <span class=\"kt\">double<\/span> <span class=\"n\">ambient<\/span> <span class=\"o\">=<\/span> <span class=\"n\">v<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"value\"<\/span><span class=\"o\">).<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"ambient\"<\/span><span class=\"o\">).<\/span><span class=\"na\">asDouble<\/span><span class=\"o\">();<\/span>\r\n                <span class=\"nc\">String<\/span> <span class=\"n\">key<\/span> <span class=\"o\">=<\/span>  <span class=\"n\">v<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"sensor\"<\/span><span class=\"o\">).<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"bid\"<\/span><span class=\"o\">).<\/span><span class=\"na\">asText<\/span><span class=\"o\">();<\/span>\r\n                <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Tuple2<\/span><span class=\"o\">&lt;&gt;(<\/span><span class=\"n\">key<\/span><span class=\"o\">,<\/span> <span class=\"n\">ambient<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"o\">})<\/span>\r\n            <span class=\"o\">.<\/span><span class=\"na\">returns<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">TupleTypeInfo<\/span><span class=\"o\">&lt;&gt;(<\/span><span class=\"nc\">TypeInformation<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">),<\/span>\r\n                                         <span class=\"nc\">TypeInformation<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"nc\">Double<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">)))<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u56e0\u4e3a\u7a0d\u5fae\u9ebb\u70e6\uff0c\u6240\u4ee5\u4f7f\u7528\u666e\u901a\u7684POJO\u66f4\u5bb9\u6613\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.github.masato.streams.flink<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Sensor<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">key<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">ambient<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Sensor<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">key<\/span><span class=\"o\">,<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">ambient<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">key<\/span> <span class=\"o\">=<\/span> <span class=\"n\">key<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">ambient<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ambient<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u805a\u5408.java<\/h3>\n<p>\u5b9e\u73b0AggregateFunction\u63a5\u53e3\u3002\u4e0eScala\u4e0d\u540c\u7684\u662f\uff0cAccumulator\u4e0d\u662fcase\u7c7b\uff0c\u4f46\u5176\u4ed6\u65b9\u9762\u51e0\u4e4e\u76f8\u540c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.github.masato.streams.flink<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.api.java.tuple.Tuple2<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.api.common.functions.AggregateFunction<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Aggregate<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">AggregateFunction<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Sensor<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Accumulator<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Accumulator<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"kt\">long<\/span> <span class=\"n\">serialVersionUID<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">3355966737412029618L<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Accumulator<\/span> <span class=\"nf\">createAccumulator<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">Accumulator<\/span><span class=\"o\">(<\/span><span class=\"mi\">0L<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"\"<\/span><span class=\"o\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"o\">,<\/span> <span class=\"mi\">0<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Accumulator<\/span> <span class=\"nf\">merge<\/span><span class=\"o\">(<\/span><span class=\"nc\">Accumulator<\/span> <span class=\"n\">a<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Accumulator<\/span> <span class=\"n\">b<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">a<\/span><span class=\"o\">.<\/span><span class=\"na\">count<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">b<\/span><span class=\"o\">.<\/span><span class=\"na\">count<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"n\">a<\/span><span class=\"o\">.<\/span><span class=\"na\">sum<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">b<\/span><span class=\"o\">.<\/span><span class=\"na\">sum<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">a<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">add<\/span><span class=\"o\">(<\/span><span class=\"nc\">Sensor<\/span> <span class=\"n\">value<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Accumulator<\/span> <span class=\"n\">acc<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">acc<\/span><span class=\"o\">.<\/span><span class=\"na\">sum<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">value<\/span><span class=\"o\">.<\/span><span class=\"na\">ambient<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"n\">acc<\/span><span class=\"o\">.<\/span><span class=\"na\">count<\/span><span class=\"o\">++;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Accumulator<\/span> <span class=\"nf\">getResult<\/span><span class=\"o\">(<\/span><span class=\"nc\">Accumulator<\/span> <span class=\"n\">acc<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">acc<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u5e73\u5747\u503c.java<\/h3>\n<p>\u8fd9\u662fWindowFunction\u7684\u5b9e\u73b0\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.github.masato.streams.flink<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.api.windowing.windows.TimeWindow<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.streaming.api.functions.windowing.WindowFunction<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.apache.flink.util.Collector<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Average<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">WindowFunction<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Accumulator<\/span><span class=\"o\">,<\/span>\r\n                                               <span class=\"nc\">Accumulator<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span><span class=\"o\">,<\/span> <span class=\"nc\">TimeWindow<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"kt\">long<\/span> <span class=\"n\">serialVersionUID<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">5532466889638450746L<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">apply<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">key<\/span><span class=\"o\">,<\/span>\r\n                      <span class=\"nc\">TimeWindow<\/span> <span class=\"n\">window<\/span><span class=\"o\">,<\/span>\r\n                      <span class=\"nc\">Iterable<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Accumulator<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">input<\/span><span class=\"o\">,<\/span>\r\n                      <span class=\"nc\">Collector<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Accumulator<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">out<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n\r\n        <span class=\"nc\">Accumulator<\/span> <span class=\"n\">in<\/span> <span class=\"o\">=<\/span> <span class=\"n\">input<\/span><span class=\"o\">.<\/span><span class=\"na\">iterator<\/span><span class=\"o\">().<\/span><span class=\"na\">next<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"n\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">collect<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">Accumulator<\/span><span class=\"o\">(<\/span><span class=\"n\">window<\/span><span class=\"o\">.<\/span><span class=\"na\">getEnd<\/span><span class=\"o\">(),<\/span> <span class=\"n\">key<\/span><span class=\"o\">,<\/span> <span class=\"n\">in<\/span><span class=\"o\">.<\/span><span class=\"na\">sum<\/span><span class=\"o\">\/<\/span><span class=\"n\">in<\/span><span class=\"o\">.<\/span><span class=\"na\">count<\/span><span class=\"o\">,<\/span> <span class=\"n\">in<\/span><span class=\"o\">.<\/span><span class=\"na\">count<\/span><span class=\"o\">));<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5728Scala\u4e2d\uff0c\u6211\u5df2\u7ecf\u76f4\u63a5\u5c06WindowFunction\u7684apply()\u65b9\u6cd5\u5b9e\u73b0\u5199\u5728\u4e86aggregate\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code>      <span class=\"o\">.<\/span><span class=\"py\">aggregate<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">Aggregate<\/span><span class=\"o\">(),<\/span>\r\n        <span class=\"o\">(<\/span> <span class=\"n\">key<\/span><span class=\"k\">:<\/span> <span class=\"kt\">String<\/span><span class=\"o\">,<\/span>\r\n          <span class=\"n\">window<\/span><span class=\"k\">:<\/span> <span class=\"kt\">TimeWindow<\/span><span class=\"o\">,<\/span>\r\n          <span class=\"n\">input<\/span><span class=\"k\">:<\/span> <span class=\"kt\">Iterable<\/span><span class=\"o\">[<\/span><span class=\"kt\">Accumulator<\/span><span class=\"o\">],<\/span>\r\n          <span class=\"n\">out<\/span><span class=\"k\">:<\/span> <span class=\"kt\">Collector<\/span><span class=\"o\">[<\/span><span class=\"kt\">Accumulator<\/span><span class=\"o\">]<\/span> <span class=\"o\">)<\/span> <span class=\"k\">=&gt;<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"k\">var<\/span> <span class=\"n\">in<\/span> <span class=\"k\">=<\/span> <span class=\"nv\">input<\/span><span class=\"o\">.<\/span><span class=\"py\">iterator<\/span><span class=\"o\">.<\/span><span class=\"py\">next<\/span><span class=\"o\">()<\/span>\r\n            <span class=\"nv\">out<\/span><span class=\"o\">.<\/span><span class=\"py\">collect<\/span><span class=\"o\">(<\/span><span class=\"nc\">Accumulator<\/span><span class=\"o\">(<\/span><span class=\"nv\">window<\/span><span class=\"o\">.<\/span><span class=\"py\">getEnd<\/span><span class=\"o\">,<\/span> <span class=\"n\">key<\/span><span class=\"o\">,<\/span> <span class=\"nv\">in<\/span><span class=\"o\">.<\/span><span class=\"py\">sum<\/span><span class=\"o\">\/<\/span><span class=\"nv\">in<\/span><span class=\"o\">.<\/span><span class=\"py\">count<\/span><span class=\"o\">,<\/span> <span class=\"nv\">in<\/span><span class=\"o\">.<\/span><span class=\"py\">count<\/span><span class=\"o\">))<\/span>\r\n          <span class=\"o\">}<\/span>\r\n      <span class=\"o\">)<\/span>\r\n<\/code><\/pre>\n<h3>pom.xml -&gt; \u9879\u76ee\u5bf9\u8c61\u6a21\u578b.xml<\/h3>\n<p>Stream\u7684Source\u4f7f\u7528Kafka\u3002\u8fde\u63a5\u4fe1\u606f\u8bbe\u7f6e\u5728exec-maven-plugin\u7684\u73af\u5883\u53d8\u91cf\u4e2d\u3002\u8bf7\u53c2\u8003\u6b64\u5904\u51c6\u5907SensorTag\u548cRaspberry Pi 3\uff0c\u4ee5\u53ca\u6784\u5efaKafka\u96c6\u7fa4\u3002<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"nt\">&lt;build&gt;<\/span>\r\n        <span class=\"nt\">&lt;plugins&gt;<\/span>\r\n...\r\n              <span class=\"nt\">&lt;plugin&gt;<\/span>\r\n                <span class=\"nt\">&lt;groupId&gt;<\/span>org.apache.maven.plugins<span class=\"nt\">&lt;\/groupId&gt;<\/span>\r\n                <span class=\"nt\">&lt;artifactId&gt;<\/span>maven-compiler-plugin<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\r\n                <span class=\"nt\">&lt;version&gt;<\/span>3.1<span class=\"nt\">&lt;\/version&gt;<\/span>\r\n                <span class=\"nt\">&lt;configuration&gt;<\/span>\r\n                  <span class=\"nt\">&lt;source&gt;<\/span>1.8<span class=\"nt\">&lt;\/source&gt;<\/span>\r\n                  <span class=\"nt\">&lt;target&gt;<\/span>1.8<span class=\"nt\">&lt;\/target&gt;<\/span>\r\n                <span class=\"nt\">&lt;\/configuration&gt;<\/span>\r\n              <span class=\"nt\">&lt;\/plugin&gt;<\/span>\r\n\r\n              <span class=\"nt\">&lt;plugin&gt;<\/span>\r\n                <span class=\"nt\">&lt;groupId&gt;<\/span>org.codehaus.mojo<span class=\"nt\">&lt;\/groupId&gt;<\/span>\r\n                <span class=\"nt\">&lt;artifactId&gt;<\/span>exec-maven-plugin<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\r\n                <span class=\"nt\">&lt;version&gt;<\/span>1.5.0<span class=\"nt\">&lt;\/version&gt;<\/span>\r\n                <span class=\"nt\">&lt;executions&gt;<\/span>\r\n                  <span class=\"nt\">&lt;execution&gt;<\/span>\r\n                    <span class=\"nt\">&lt;id&gt;<\/span>App<span class=\"nt\">&lt;\/id&gt;<\/span>\r\n                    <span class=\"nt\">&lt;goals&gt;<\/span>\r\n                      <span class=\"nt\">&lt;goal&gt;<\/span>exec<span class=\"nt\">&lt;\/goal&gt;<\/span>\r\n                    <span class=\"nt\">&lt;\/goals&gt;<\/span>\r\n                  <span class=\"nt\">&lt;\/execution&gt;<\/span>\r\n                <span class=\"nt\">&lt;\/executions&gt;<\/span>\r\n                <span class=\"nt\">&lt;configuration&gt;<\/span>\r\n                  <span class=\"nt\">&lt;executable&gt;<\/span>java<span class=\"nt\">&lt;\/executable&gt;<\/span>\r\n                  <span class=\"nt\">&lt;classpathScope&gt;<\/span>compile<span class=\"nt\">&lt;\/classpathScope&gt;<\/span>\r\n                  <span class=\"nt\">&lt;arguments&gt;<\/span>\r\n                    <span class=\"nt\">&lt;argument&gt;<\/span>-cp<span class=\"nt\">&lt;\/argument&gt;<\/span>\r\n                    <span class=\"nt\">&lt;classpath\/&gt;<\/span>\r\n                    <span class=\"nt\">&lt;argument&gt;<\/span>com.github.masato.streams.flink.App<span class=\"nt\">&lt;\/argument&gt;<\/span>\r\n                  <span class=\"nt\">&lt;\/arguments&gt;<\/span>\r\n                  <span class=\"nt\">&lt;environmentVariables&gt;<\/span>\r\n                    <span class=\"nt\">&lt;APPLICATION_ID_CONFIG&gt;<\/span>sensortag<span class=\"nt\">&lt;\/APPLICATION_ID_CONFIG&gt;<\/span>\r\n                    <span class=\"nt\">&lt;BOOTSTRAP_SERVERS_CONFIG&gt;<\/span>confluent:9092<span class=\"nt\">&lt;\/BOOTSTRAP_SERVERS_CONFIG&gt;<\/span>\r\n                    <span class=\"nt\">&lt;SOURCE_TOPIC&gt;<\/span>sensortag<span class=\"nt\">&lt;\/SOURCE_TOPIC&gt;<\/span>\r\n                    <span class=\"nt\">&lt;SINK_TOPIC&gt;<\/span>sensortag-sink<span class=\"nt\">&lt;\/SINK_TOPIC&gt;<\/span>\r\n                    <span class=\"nt\">&lt;GROUP_ID&gt;<\/span>flinkGroup<span class=\"nt\">&lt;\/GROUP_ID&gt;<\/span>\r\n                  <span class=\"nt\">&lt;\/environmentVariables&gt;<\/span>\r\n                <span class=\"nt\">&lt;\/configuration&gt;<\/span>\r\n              <span class=\"nt\">&lt;\/plugin&gt;<\/span>\r\n<\/code><\/pre>\n<h3>\u8fdb\u884c<\/h3>\n<p>\u5728\u5c06Raspberry Pi 3\u7684SensorTag\u6570\u636e\u53d1\u9001\u5230Kafka\u4e4b\u540e\uff0c\u6267\u884cexec-maven-plugin\u63d2\u4ef6\u7684exec\u76ee\u6807\u3002<\/p>\n<pre class=\"post-pre\"><code>$ mvn clean install exec:exec@App\r\n<\/code><\/pre>\n<p>\u4f7f\u752860\u79d2\u7684\u6eda\u52a8\u7a97\u53e3\u5bf9\u5468\u56f4\u6e29\u5ea6\u8fdb\u884c\u4e86\u5e73\u5747\u503c\u805a\u5408\uff0c\u5e76\u5c06\u7ed3\u679c\u8f93\u51fa\u5230\u6807\u51c6\u8f93\u51fa\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">{<\/span><span class=\"s2\">\"ambient\"<\/span>:28.395833333333332,<span class=\"s2\">\"time\"<\/span>:<span class=\"s2\">\"2017-08-28T11:57:00+09:00\"<\/span>,<span class=\"s2\">\"bid\"<\/span>:<span class=\"s2\">\"B0:B4:48:BD:DA:03\"<\/span><span class=\"o\">}<\/span>\r\n<span class=\"o\">{<\/span><span class=\"s2\">\"ambient\"<\/span>:28.44375,<span class=\"s2\">\"time\"<\/span>:<span class=\"s2\">\"2017-08-28T11:58:00+09:00\"<\/span>,<span class=\"s2\">\"bid\"<\/span>:<span class=\"s2\">\"B0:B4:48:BD:DA:03\"<\/span><span class=\"o\">}<\/span>\r\n<span class=\"o\">{<\/span><span class=\"s2\">\"ambient\"<\/span>:28.46875,<span class=\"s2\">\"time\"<\/span>:<span class=\"s2\">\"2017-08-28T11:59:00+09:00\"<\/span>,<span class=\"s2\">\"bid\"<\/span>:<span class=\"s2\">\"B0:B4:48:BD:DA:03\"<\/span><span class=\"o\">}<\/span>\r\n<span class=\"o\">{<\/span><span class=\"s2\">\"ambient\"<\/span>:28.5,<span class=\"s2\">\"time\"<\/span>:<span class=\"s2\">\"2017-08-28T12:00:00+09:00\"<\/span>,<span class=\"s2\">\"bid\"<\/span>:<span class=\"s2\">\"B0:B4:48:BD:DA:03\"<\/span><span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u4f7f\u7528Apache Flink\u548cScala API\u5c1d\u8bd5\u4e86SensorTag\u7684\u4f20\u611f\u5668\u6570\u636e\u7684\u7a97\u53e3\u805a\u5408\u3002\u6211\u5c06\u5c3d\u91cf\u4f7f\u7528 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-47010","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528Apache Flink\u548cJava 8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528apache-flink\u548cjava-8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Apache Flink\u548cJava 8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408\" \/>\n<meta property=\"og:description\" content=\"\u6211\u4f7f\u7528Apache Flink\u548cScala API\u5c1d\u8bd5\u4e86SensorTag\u7684\u4f20\u611f\u5668\u6570\u636e\u7684\u7a97\u53e3\u805a\u5408\u3002\u6211\u5c06\u5c3d\u91cf\u4f7f\u7528 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528apache-flink\u548cjava-8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-19T12:03:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T08:15:46+00:00\" \/>\n<meta name=\"author\" content=\"\u79d1, \u9896\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u9896\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/\",\"name\":\"\u4f7f\u7528Apache Flink\u548cJava 8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2024-01-19T12:03:44+00:00\",\"dateModified\":\"2024-04-30T08:15:46+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528Apache Flink\u548cJava 8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e\",\"name\":\"\u79d1, \u9896\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u9896\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keying\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528Apache Flink\u548cJava 8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528apache-flink\u548cjava-8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Apache Flink\u548cJava 8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408","og_description":"\u6211\u4f7f\u7528Apache Flink\u548cScala API\u5c1d\u8bd5\u4e86SensorTag\u7684\u4f20\u611f\u5668\u6570\u636e\u7684\u7a97\u53e3\u805a\u5408\u3002\u6211\u5c06\u5c3d\u91cf\u4f7f\u7528 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528apache-flink\u548cjava-8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2024-01-19T12:03:44+00:00","article_modified_time":"2024-04-30T08:15:46+00:00","author":"\u79d1, \u9896","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u9896","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/","name":"\u4f7f\u7528Apache Flink\u548cJava 8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2024-01-19T12:03:44+00:00","dateModified":"2024-04-30T08:15:46+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528Apache Flink\u548cJava 8\u5bf9\u4f20\u611f\u5668\u6570\u636e\u8fdb\u884c\u7a97\u53e3\u805a\u5408"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e","name":"\u79d1, \u9896","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g","caption":"\u79d1, \u9896"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keying\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8apache-flink%e5%92%8cjava-8%e5%af%b9%e4%bc%a0%e6%84%9f%e5%99%a8%e6%95%b0%e6%8d%ae%e8%bf%9b%e8%a1%8c%e7%aa%97%e5%8f%a3%e8%81%9a%e5%90%88\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47010","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=47010"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47010\/revisions"}],"predecessor-version":[{"id":92946,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47010\/revisions\/92946"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=47010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=47010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=47010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}