Java Spark使用Column读取Java Map值返回null该如何解决
错误原因
你编写的代码中map1.get(col("KEY"))是在Driver端直接执行的,col("KEY")是Spark定义的逻辑列对象,不是数据集每行中实际存储的KEY值,因此HashMap的get方法只会返回null,再通过lit方法转成常量列后,所有行的ABCD列值自然都是null。
修正方案
直接使用Spark原生的Map列操作即可实现按行匹配取值,性能比自定义UDF更优,修正后的代码如下:
import org.apache.spark.sql.functions; Map<String, String> map1 = new HashMap<>(); map1.put("1", "CUST1"); map1.put("2", "CUST2"); // 先将Java HashMap转为Spark的Map类型列,再按每行KEY列的值取对应value dataset1 = dataset1.withColumn("ABCD", functions.typedLit(map1).getItem(functions.col("KEY")));
注意:需要保证KEY列的数据类型和Map的key类型完全一致,否则依然会返回null。如果你的KEY列是整数类型,需要把Map的泛型改为
Map<Integer, String>,对应put的key也改为整数1、2。
内容的提问来源于stack exchange,提问作者Krushna Belerao
相关产品推荐
相关产品推荐

