You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by IORI <32...@qq.com> on 2019/03/26 01:46:04 UTC

flink疑问

请问:数据流通过算子A时,我想分裂成两个数据流,一个数据流进行算子B操作然后sink,另外一个数据流需要先进行算子C操作,再reduce然后sink,请问这种情况应该如何处理?一个operator中能出来两个不同的数据流吗?

Re: flink疑问

Posted by wuzhixin <wu...@wecash.net>.
split

<table border="0" cellspacing="0" width="100%" cellpadding="0" id="main" style="display: block;"><tbody><tr><td><table width="710" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td><table width="820" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td width="201" height="140" valign="top"><table width="200" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td class="mi" style="font-family:微软雅黑; font-size:12px; line-height:25px; color:#003C70" id="personage"><strong style="font-size:14px;">吴志新</strong><br>高级Java开发 &nbsp; &nbsp;商业计算部</td></tr><tr><td height="86" valign="bottom" class="yi" style="font-family: Arial; line-height: 16px; color: rgb(0, 60, 112);" id="personageEn"><b></b><br><br></td></tr></tbody></table></td><td width="367" align="right" valign="top" style="border-left:2px #063B71 dotted;"><table width="325" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td height="60" valign="top"><img src="http://pic.mmkj.site/360.jpg" width="180" height="25"></td></tr><tr><td height="20">&nbsp;</td></tr><tr><td height="25" class="xie" style="font-family:微软雅黑; font-size:12px; line-height:21px; color:#003C70">中国 北京 朝阳区农展馆南路13号 瑞辰国际中心8层</td></tr><tr><td class="yi" style="font-family:Arial; font-size:12px; line-height:16px; color:#003C70">8F, Ruichen Int'l Center, No. 13, Nongzhanguan<br> South Rd, Chaoyang District, Beijing, China</td></tr></tbody></table></td><td width="252" align="left" valign="bottom"><table width="200" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td width="58" class="xie" style="font-family:微软雅黑; font-size:12px; line-height:19px; color:#003C70"> M /手机<br> E / 邮箱<br> H / 网址</td><td width="142" class="xie" style="font-family:微软雅黑; font-size:12px; line-height:19px; color:#003C70" id="personelse">13141163261<br>wuzhixin@wecash.net<br>www.abakus.cn</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table><table width="100%" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td height="105" valign="bottom" class="bo" style="font-family:Arial; font-size:12px; color:#d1d1d1">=======================================================================================================<span class="bo" style="font-family:Arial; font-size:12px; color:#d1d1d1">======</span><br> 本邮件载有秘密信息,请您恪守保密义务,勿向第三人透漏。谢谢合作。<br> This message contains information which may be confidential and privileged. Unless you are the addressee (or authorized to receive for the <br><span class="bo" style="font-family:Arial; font-size:12px; color:#d1d1d1">addressee), </span> you may not use, copy or disclose to anyone the message or any information contained in the message. </td></tr></tbody></table></td></tr></tbody></table>

> 在 2019年3月26日,上午9:46,IORI <32...@qq.com> 写道:
> 
> 请问:数据流通过算子A时,我想分裂成两个数据流,一个数据流进行算子B操作然后sink,另外一个数据流需要先进行算子C操作,再reduce然后sink,请问这种情况应该如何处理?一个operator中能出来两个不同的数据流吗?


Re: flink疑问

Posted by wuzhixin <wu...@wecash.net>.
split之后   做 select

> 在 2019年3月26日,上午10:09,baiyg25281@hundsun.com 写道:
> 
> 一个算子出来两个流好像不能吧。
> 要想实现你说的,可以先基于A流过滤生成要进行B算子的流,基于A流过滤生成要进行C算子的流。
> 
> 
> 
> baiyg25281@hundsun.com
> 
> 发件人: IORI
> 发送时间: 2019-03-26 09:46
> 收件人: user-zh
> 主题: flink疑问
> 请问:数据流通过算子A时,我想分裂成两个数据流,一个数据流进行算子B操作然后sink,另外一个数据流需要先进行算子C操作,再reduce然后sink,请问这种情况应该如何处理?一个operator中能出来两个不同的数据流吗? 


回复: 回复: flink疑问

Posted by 邓成刚【qq】 <bn...@qq.com>.
DataStream ds = ....


DataStream ds1 = 直接拿ds 做 B操作                生成的新流,SINK或其它的,你想干什么都可以,

DataStream ds2 = 直接拿ds 做 C操作                生成的新流,SINK或其它的,你想干什么都可以,


在DS1,DS2里,DS是同一个流。。。就像SQL中的表一样,它们是一样的东东,其实就是复用,你可以试试。。。


邓成刚【qq】
 
发件人: baiyg25281@hundsun.com
发送时间: 2019-03-26 10:09
收件人: user-zh
主题: 回复: flink疑问
一个算子出来两个流好像不能吧。
要想实现你说的,可以先基于A流过滤生成要进行B算子的流,基于A流过滤生成要进行C算子的流。
 
 
 
baiyg25281@hundsun.com
发件人: IORI
发送时间: 2019-03-26 09:46
收件人: user-zh
主题: flink疑问
请问:数据流通过算子A时,我想分裂成两个数据流,一个数据流进行算子B操作然后sink,另外一个数据流需要先进行算子C操作,再reduce然后sink,请问这种情况应该如何处理?一个operator中能出来两个不同的数据流吗?

Re: flink疑问

Posted by Kurt Young <yk...@gmail.com>.
大家都好热情啊~

@IORI,这个问题取决于你是要把一个流复制成两个流分别套用不用的处理逻辑呢,还是说是要把数据根据一定的规则分开成两个流。
如果是复制的话,用@邓成刚 的方法就可以
如果是要进行数据分割的话,那用split或者sideoutput都行

Best,
Kurt


On Tue, Mar 26, 2019 at 10:45 AM Yun Chen <yu...@hotmail.com> wrote:

> split官方好像是不建议使用了,建议使用   Side Outputs
>
>
> https://ci.apache.org/projects/flink/flink-docs-release-1.7/dev/stream/side_output.html
>
>
> 下面是示例参考
>
>
> val xOutputTag = OutputTag[String]("xx-side-output")
> val xxOutputTag = OutputTag[String]("xx-side-output")
>
> val xxx = xxx.process(new ProcessFunction[String, String] {
>   override def processElement(i: String, context: ProcessFunction[String,
> String]#Context,
>                               collector: Collector[String]): Unit = {
>
>     .......
>
>     arrData(0) = channel
>     arrData(1) = tboxinfo
>
>     collector.collect(parse)
>
>     context.output(channelOutputTag,String.valueOf(arrData(0)))
>     context.output(eventOutputTag,arrData(1))
>
>   }
>   })
>
> val xStream = ouputStream.getSideOutput(xOutputTag)
> val xxStream = ouputStream.getSideOutput(xxOutputTag)
>
> Best,
> YunKillere
>
> ________________________________
> 发件人: 戴嘉诚 <a7...@gmail.com>
> 发送时间: 2019年3月25日 19:26
> 收件人: user-zh@flink.apache.org
> 主题: 答复: flink疑问
>
> 使用 Split 算子把流根据特定条件拆分成两个或者更多,然后在用select算子从拆分流中选择对应的拆分流做处理即可。
> 可以看看文档上,有介绍用法
>
> https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/
>
> 发件人: baiyg25281@hundsun.com
> 发送时间: 2019年3月26日 10:10
> 收件人: user-zh
> 主题: 回复: flink疑问
>
> 一个算子出来两个流好像不能吧。
> 要想实现你说的,可以先基于A流过滤生成要进行B算子的流,基于A流过滤生成要进行C算子的流。
>
>
>
> baiyg25281@hundsun.com
>
> 发件人: IORI
> 发送时间: 2019-03-26 09:46
> 收件人: user-zh
> 主题: flink疑问
>
> 请问:数据流通过算子A时,我想分裂成两个数据流,一个数据流进行算子B操作然后sink,另外一个数据流需要先进行算子C操作,再reduce然后sink,请问这种情况应该如何处理?一个operator中能出来两个不同的数据流吗?
>
>

回复: flink疑问

Posted by Yun Chen <yu...@hotmail.com>.
split官方好像是不建议使用了,建议使用   Side Outputs

https://ci.apache.org/projects/flink/flink-docs-release-1.7/dev/stream/side_output.html


下面是示例参考


val xOutputTag = OutputTag[String]("xx-side-output")
val xxOutputTag = OutputTag[String]("xx-side-output")

val xxx = xxx.process(new ProcessFunction[String, String] {
  override def processElement(i: String, context: ProcessFunction[String, String]#Context,
                              collector: Collector[String]): Unit = {

    .......

    arrData(0) = channel
    arrData(1) = tboxinfo

    collector.collect(parse)

    context.output(channelOutputTag,String.valueOf(arrData(0)))
    context.output(eventOutputTag,arrData(1))

  }
  })

val xStream = ouputStream.getSideOutput(xOutputTag)
val xxStream = ouputStream.getSideOutput(xxOutputTag)

Best,
YunKillere

________________________________
发件人: 戴嘉诚 <a7...@gmail.com>
发送时间: 2019年3月25日 19:26
收件人: user-zh@flink.apache.org
主题: 答复: flink疑问

使用 Split 算子把流根据特定条件拆分成两个或者更多,然后在用select算子从拆分流中选择对应的拆分流做处理即可。
可以看看文档上,有介绍用法
https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/

发件人: baiyg25281@hundsun.com
发送时间: 2019年3月26日 10:10
收件人: user-zh
主题: 回复: flink疑问

一个算子出来两个流好像不能吧。
要想实现你说的,可以先基于A流过滤生成要进行B算子的流,基于A流过滤生成要进行C算子的流。



baiyg25281@hundsun.com

发件人: IORI
发送时间: 2019-03-26 09:46
收件人: user-zh
主题: flink疑问
请问:数据流通过算子A时,我想分裂成两个数据流,一个数据流进行算子B操作然后sink,另外一个数据流需要先进行算子C操作,再reduce然后sink,请问这种情况应该如何处理?一个operator中能出来两个不同的数据流吗?


答复: flink疑问

Posted by 戴嘉诚 <a7...@gmail.com>.
使用 Split 算子把流根据特定条件拆分成两个或者更多,然后在用select算子从拆分流中选择对应的拆分流做处理即可。
可以看看文档上,有介绍用法
https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/

发件人: baiyg25281@hundsun.com
发送时间: 2019年3月26日 10:10
收件人: user-zh
主题: 回复: flink疑问

一个算子出来两个流好像不能吧。
要想实现你说的,可以先基于A流过滤生成要进行B算子的流,基于A流过滤生成要进行C算子的流。



baiyg25281@hundsun.com
 
发件人: IORI
发送时间: 2019-03-26 09:46
收件人: user-zh
主题: flink疑问
请问:数据流通过算子A时,我想分裂成两个数据流,一个数据流进行算子B操作然后sink,另外一个数据流需要先进行算子C操作,再reduce然后sink,请问这种情况应该如何处理?一个operator中能出来两个不同的数据流吗? 


回复: flink疑问

Posted by "baiyg25281@hundsun.com" <ba...@hundsun.com>.
一个算子出来两个流好像不能吧。
要想实现你说的,可以先基于A流过滤生成要进行B算子的流,基于A流过滤生成要进行C算子的流。



baiyg25281@hundsun.com
 
发件人: IORI
发送时间: 2019-03-26 09:46
收件人: user-zh
主题: flink疑问
请问:数据流通过算子A时,我想分裂成两个数据流,一个数据流进行算子B操作然后sink,另外一个数据流需要先进行算子C操作,再reduce然后sink,请问这种情况应该如何处理?一个operator中能出来两个不同的数据流吗?