首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java使用Spark列从java Map读取值

使用Java使用Spark列从java Map读取值
EN

Stack Overflow用户
提问于 2021-10-14 06:28:38
回答 1查看 46关注 0票数 1

我尝试了下面的代码,通过java中的spark列获取Map值,但根据每个关键字搜索,从Map获取期望精确值的null值。

Spark数据集包含一列,名称为KEY,数据集名称为dataset1

数据集中的值:

代码语言:javascript
复制
KEY
1
2 

Java代码-

代码语言:javascript
复制
Map<String,string> map1 = new HashMap<>();
map1.put("1","CUST1");
map1.put("2","CUST2");


dataset1.withColumn("ABCD", functions.lit(map1.get(col("KEY"))));

当前输出为:

代码语言:javascript
复制
ABCD (Column name)
null
null

预期输出:

代码语言:javascript
复制
ABCD (Column name)
CUST1
CUST2

请让我得到这个预期的输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中。类似于:

代码语言:javascript
复制
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)"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69565991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档