我尝试了下面的代码,通过java中的spark列获取Map值,但根据每个关键字搜索,从Map获取期望精确值的null值。
Spark数据集包含一列,名称为KEY,数据集名称为dataset1
数据集中的值:
KEY
1
2 Java代码-
Map<String,string> map1 = new HashMap<>();
map1.put("1","CUST1");
map1.put("2","CUST2");
dataset1.withColumn("ABCD", functions.lit(map1.get(col("KEY"))));当前输出为:
ABCD (Column name)
null
null预期输出:
ABCD (Column name)
CUST1
CUST2请让我得到这个预期的输出。
发布于 2021-10-14 07:56:36
得到这个输出的原因很简单。java中的get函数可以接受任何对象作为输入。如果对象不在映射中,则结果为null。
spark中的lit函数用于创建单个值列(所有行都具有相同的值)。例如,lit(1)为每一行创建一个值为1的列。
在这里,map1.get(col("KEY")) (在驱动程序上执行)询问map1对应于列对象(而不是列中的值,代表列的java/scala对象)的值。映射不包含该对象,因此结果为null。因此,您也可以编写lit(null)。这就是为什么你在你的数据集中得到一个空的结果。
为了解决您的问题,您可以将您的map访问封装在一个UDF中。类似于:
UserDefinedFunction map_udf = udf(new UDF1<String, String>() {
@Override
public String call(String x) {
return map1.get(x);
}
}, DataTypes.StringType );
spark.udf().register("map_udf", map_udf);
result.withColumn("ABCD", expr("map_udf(KEY)"));https://stackoverflow.com/questions/69565991
复制相似问题