我想使用变量来选择两个变量值范围之间的条目。我的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'。
当我运行上述查询时,它显示表中所有条目的计数,但根据条件,它应显示与给定范围内的条目数相对应的计数。出了什么问题?
答案 0 :(得分:0)
我的猜测是你在Driver中更改了这些全局变量,执行者也看不到这些变化。执行程序进程通常位于不同的节点上,因为它无法访问另一个节点中另一个进程的正常变量。
通常,在Spark中使用全局变量是个坏主意。 Spark提供broadcast variables来共享执行程序和驱动程序之间的变量。