我已经尝试过下面的代码通过java中的spark列获得Map
值,但获得null
值期望从Map中获得准确的值。
和Spark Dataset包含一列,名称为KEY
,数据集名称为dataset1
values in dataset:
KEY
1
2
Java Code -
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
请让我得到这个预期的输出。
得到这个输出的原因非常简单。java中的get
函数可以接受任何对象作为输入。如果该对象不在映射中,则结果为空。
spark中的lit
函数用于创建单个值列(所有行具有相同的值)。例如lit(1)
创建一个专栏,每一行的值1。
这里,map1.get(col("KEY"))
(在驱动程序上执行)向map1
询问与列对象对应的值(不是列内部的值,而是代表列的java/scala对象)。映射不包含该对象,因此结果为空。因此,您也可以编写lit(null)
。这就是为什么你在你的数据集中得到一个空结果。
要解决这个问题,可以将映射访问封装在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)"));