Spark 2.1.1:如何将变量绑定到Structured Streaming查询

时间:2017-06-16 09:38:31

标签: apache-spark user-defined-functions spark-structured-streaming

我想使用变量来选择两个变量值范围之间的条目。我的SQL查询是String sql = "Select count(*) FROM Records WHERE event_time <= UPPERTIME('1') AND event_time >= LOWERTIME('1')";。在此查询中,UPPERTIME('1')LOWERTIME('1')是UDF,其定义为

    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'。

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

1 个答案:

答案 0 :(得分:0)

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

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