如何解决编写UDF以在Java中的Map中查找,以提供不受支持的文字类型类java.util.HashMap
我正在将Java8与Spark v2.4.1一起使用
我正在尝试使用UDF通过地图进行查找,如下所示
数据:
+-----+-----+-----+
|code1|code2|code3|
+-----+-----+-----+
|1 |7 | 5 |
|2 |7 | 4 |
|3 |7 | 3 |
|4 |7 | 2 |
|5 |7 | 1 |
+-----+-----+-----+
预期数据:
+-----+-----+-----+
|code1|code2|code3|
+-----+-----+-----+
|1 |7 |51 |
|2 |7 |41 |
|3 |7 |31 |
|4 |7 |21 |
|5 |7 |11 |
+-----+-----+-----+
Map<Integer,Integer> map= new HashMap<>();
map.put(1,11);
map.put(2,21);
map.put(3,31);
map.put(4,41);
map.put(5,51);
public static UDF2 userDefinedFunction= new UDF2<java.util.Map<Integer,Integer>,Integer,Integer>()
{
private static final long serialVersionUID = 1L;
@Override
public Integer call(java.util.Map<Integer,Integer> map,Integer score) throws Exception {
return map.get(score);
}
};
Dataset<Row> resultDs= dataDs.withColumn("code3",functions.callUDF("userDefinedFunction",col("code3"),lit(map) ) )
错误:
java.lang.RuntimeException:不支持的文字类型类java.util.HashMap
这是怎么了?如何使用JavaAPI在UDF中传递/处理HashMap参数
数据:
List<String[]> stringAsList = new ArrayList<>();
stringAsList.add(new String[] { "1","7","5" });
stringAsList.add(new String[] { "2","4" });
stringAsList.add(new String[] { "3","3" });
stringAsList.add(new String[] { "4","2" });
stringAsList.add(new String[] { "5","1" });
JavaSparkContext sparkContext = new JavaSparkContext(sparkSession.sparkContext());
JavaRDD<Row> rowRDD = sparkContext.parallelize(stringAsList).map((String[] row) -> RowFactory.create(row));
StructType schema = DataTypes
.createStructType(new StructField[] {
DataTypes.createStructField("code1",DataTypes.StringType,false),DataTypes.createStructField("code2",DataTypes.createStructField("code3",false)
});
Dataset<Row> dataDf= sparkSession.sqlContext().createDataFrame(rowRDD,schema).toDF();
Dataset<Row> dataDs = dataDf
.withColumn("code1",col("code1").cast(DataTypes.IntegerType))
.withColumn("code2",col("code2").cast(DataTypes.IntegerType))
.withColumn("code3",col("code3").cast(DataTypes.IntegerType))
;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。