使用Java使用Spark Column从Java Map读取值



我已经尝试过下面的代码通过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)"));

最新更新