[英]Read values from Java Map using Spark Column using java
我已经尝试在下面的代码中通过 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
请我得到这个预期的输出。
你得到这个输出的原因很简单。 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)"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.