请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

flink广播变量不能复用吗?

 val broadVar = env.fromCollection(List(Room("a", 11.2), Room("b", 22.3)))
    val data = env.fromCollection(List("a", "b"))

    val ds1 = data.map(new RichMapFunction[String, String] {
      override def open(parameters: Configuration): Unit = {
        val broadCast = getRuntimeContext.getBroadcastVariable[String]("roomBroadcast")
        println(broadCast.size())
      }
      override def map(in: String): String = {in}
    }).withBroadcastSet(broadVar, "roomBroadcast")
    
    ds1.print()

    data.map(new RichMapFunction[String, String] {
      override def open(parameters: Configuration): Unit = {
        val broadCast = getRuntimeContext.getBroadcastVariable[String]("roomBroadcast")
        println(broadCast.size())
      }
      override def map(in: String): String = {in}
    }).print()

在第一个算子里传递了广播变量后,在第二个算子没有传递,就不能复用使用之前广播好的变量吗?

正在回答

2回答

这么测试没用过,你的代码是同一个数据集来的,直接一次能处理掉不

1 回复 有任何疑惑可以回复我~
提问者 Amourxxxx 2021-03-02 00:09:59

这种场景肯定是不能一次性处理的啊。
比如有个字典表。广播后,在多处逻辑都需要使用。这种情况应该很常见的。然后在这里我貌似只能,每个需要使用到的算子都广播一次?

1 回复 有任何疑惑可以回复我~
  • 你的场景没问题,用法第二个是data开始的,第一个用广播,第二个和第一个根本没关系呢,咋能收到呢?也得第一个那么写
    回复 有任何疑惑可以回复我~ 2021-03-02 00:12:45
  • 也需要with。。。下
    回复 有任何疑惑可以回复我~ 2021-03-02 00:13:34
  • 提问者 Amourxxxx #3
    额。。我说的场景,如果用spark解决,就是直接在driver里注册一次广播变量,然后在任意算子里都可以执行。
    
    我上面模拟的这个代码,如果再加个with。。不就重复了么。和那个data没关系,我想表达的意思就是,这个with貌似是和使用方的算子强绑定的。谁用谁给自己传递一份。这样的话。不相当于,多次传递了么。有没有其他更好的方法呢。
    回复 有任何疑惑可以回复我~ 2021-03-02 00:19:51
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信