У меня есть Dataset<Row>
, в котором есть четыре столбца из четырех двух столбцов. Непримитивные типы данных List<Long> and List<String>
.
+------+---------------+---------------------------------------------+---------------+
| Id| value | time |aggregateType |
+------+---------------+---------------------------------------------+---------------+
|0001 | [1.5,3.4,4.5]| [1551502200000,1551502200000,1551502200000] | Sum |
+------+---------------+---------------------------------------------+---------------+
У меня есть UDF3, который принимает три аргумента и возвращаетDouble
значение UDF3<String,List<Long>,List<String>,Double>
.
Поэтому, когда я вызываю UDF, он выдает исключение, говорящее
Ошибка
caused by java.lang.classcastexception scala.collection.mutable.wrappedarray$ofref cannot be cast to java.lang.List
Но если яизменил типы на String
как UDF3<String,String,String,Double>
не жаловаться.
Код, который выдает выше Исключение
UDF3<String,List<Long>,List<String>,Double> getAggregate = new UDF3<String,List<Long>,List<String>,Double>() {
public Double call(String t1,List<Long> t2,List<String> t3) throws Exception {
//do some process to return double
return double;
}
sparkSession.udf().register("getAggregate_UDF",getAggregate, DataTypes.DoubleType);
inputDS = inputDs.withColumn("value_new",callUDF("getAggregate_UDF",col("aggregateType"),col("time"),col("value")));
Код после изменения всех типовв строку
UDF3<String,String,String,Double> getAggregate = new UDF3<String,String,String,Double>() {
public Double call(String t1,String t2,String t3) throws Exception {
//code to convert t2 and t3 to List<Long> and List<String> respectively
//do some process to return double
return double;
}
sparkSession.udf().register("getAggregate_UDF",getAggregate, DataTypes.DoubleType);
inputDS = inputDs.withColumn("value_new",callUDF("getAggregate_UDF",col("aggregateType"),col("time").cast("String"),col("value").cast("String")));
Приведенный выше код работает, но с String to List
преобразованием вручную.
Требуется помощь
I) Какбросьте Непримитивные типы данных List<Long> and List<String>
в наборе данных, чтобы преодолеть caused by java.lang.classcastexception scala.collection.mutable.wrappedarray$ofref cannot be cast to java.lang.List
II), пожалуйста, предложите мне, если есть какое-то решение
Спасибо.