2017-06-16 64 views
0

我想使用这些变量来选择两个变量值范围之间的条目。我的SQL查询是String sql = "Select count(*) FROM Records WHERE event_time <= UPPERTIME('1') AND event_time >= LOWERTIME('1')";。在此查询UPPERTIME('1')LOWERTIME('1')是UDF有定义Spark 2.1.1:如何将变量绑定到结构化流式查询

spark.udf().register("LOWERTIME", new UDF1 < String, String >() { 
     @Override public String call(String lowertime) { 
      System.out.println("lowerTime="+lowerTime.toString()); 
      return lowerTime.toString(); 
      } 
      }, DataTypes.StringType); 


spark.udf().register("UPPERTIME", new UDF1 < String, String >() { 
     @Override public String call(String uppertime) { 
      System.out.println("upperTime="+upperTime.toString()); 
       return upperTime.toString(); 
      } 
      }, DataTypes.StringType); 

传递给UDF的参数是假,我真的返回了全局变量“upperTime和lowerTime”。

当我运行上面的查询时,它显示了表中所有条目的计数,但根据条件它应该显示与条目数相对应的计数落在给定范围内。出了什么问题?

回答

0

我的猜测是你在Driver中更改了这些全局变量,执行者看不到这些更改。执行程序进程通常位于不同的节点上,并且导致它无法访问另一个节点中另一个进程中的普通变量。

一般来说,在Spark中使用全局变量是一个坏主意。 Spark提供broadcast variables以在执行者和驱动程序之间共享变量。

+0

谢谢@zsxwing,但我想与我的SQL查询绑定的变量不是只读的,而是我想在满足特定条件后通过某个常量值增加它们。 – kadsank

+0

我不认为您可以在Spark工作期间广播您的更改。另外,你似乎假设处理数据的顺序?这通常是错误的。 – zsxwing