Java 为什么不将数据添加到地图中,而可以使用相同的函数将数据集打印到控制台。我做错了什么? dataset=dataset.withColumn(“概率”),callUDF(“检查概率”,col(“确认”),col(“总体”); 映射概率=新HashMap(); ArrayList a=新的ArrayList(); dataset=dataset.limit(35); 数据集显示(36); dataset.foreach((ForeachFunction)行->a.add(row.getAs(“State”).toString()); System.out.println(a.size());

Java 为什么不将数据添加到地图中,而可以使用相同的函数将数据集打印到控制台。我做错了什么? dataset=dataset.withColumn(“概率”),callUDF(“检查概率”,col(“确认”),col(“总体”); 映射概率=新HashMap(); ArrayList a=新的ArrayList(); dataset=dataset.limit(35); 数据集显示(36); dataset.foreach((ForeachFunction)行->a.add(row.getAs(“State”).toString()); System.out.println(a.size());,java,sql,apache-spark,hashmap,Java,Sql,Apache Spark,Hashmap,无论我做什么,尺寸都打印为0。我尝试了arraylist和map,但没有成功。Spark将工作负载分配给不同的服务器。驱动程序进程为每个执行器提供每个局部变量的副本。此副本独立于原始变量,如果执行者更改副本,则原始变量保持不变foreach由执行者运行,每个执行者都有自己的a副本。如果打印ArrayList,您可以看到: ArrayList a=新的ArrayList(); dataset=dataset.limit(35); 数据集显示(36); System.out.println(“驱动程

无论我做什么,尺寸都打印为0。我尝试了arraylist和map,但没有成功。

Spark将工作负载分配给不同的服务器。驱动程序进程为每个执行器提供每个局部变量的副本。此副本独立于原始变量,如果执行者更改副本,则原始变量保持不变
foreach
由执行者运行,每个执行者都有自己的
a
副本。如果打印
ArrayList
,您可以看到:

ArrayList a=新的ArrayList();
dataset=dataset.limit(35);
数据集显示(36);
System.out.println(“驱动程序进程中的a:+System.identityHashCode(a));
dataset.foreach((ForeachFunction)行->{
a、 添加(row.getAs(“value”).toString());
System.out.println(“执行器上的a”+系统标识HASHCODE(a));
});
System.out.println(“回到驱动程序进程:“+System.identityHashCode(a));
印刷品

驱动程序进程中的
a:1859780907
对遗嘱执行人的追诉229101481
执行人2105534525上的a
遗嘱执行人1982276971
回到驱动程序进程:1859780907
因此,调用
size()
ArrayList
永远不会更改


顺便说一句:在执行器上使用驱动程序的局部变量是一种不好的做法,因为这可能会导致(不仅仅是性能)问题。在调用FrACH之前,你应该考虑使用和.< /P>是否包含任何元素?你应该让我们看看这个数据集是什么。正如@normalz所说,它可能根本不包含任何元素。这段代码不使用映射,只使用列表。所以你的标题和标签是错误和误导的。