0

我想使用变量来选择两个变量值范围之间的条目。我的 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”。

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

4

1 回答 1

0

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

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

于 2017-06-16T17:57:44.480 回答