У меня есть класс Java, который определяет мой JSON, и этот класс содержит некоторые свойства Integer. Spark может прочитать этот JSON и проанализировать его с помощью вышеуказанного кодировщика классов Java. Я также могу выполнять обычные вещи Spark SQL.
Но, когда я пытаюсь преобразовать этот набор данных Spark в JavaRDD или пытаюсь собрать данные в драйвере с помощью collectAsList или collect, происходит сбой с ошибкой во время компиляции.
ЕслиЯ конвертирую эти свойства Integer в Long, все начинает работать.
Итак, чего мне здесь не хватает в отношении "Spark-Java-Integers"?
Ссылки типаони просто сообщают о решении, но не дают оснований для реальной проблемы.
1) https://issues.apache.org/jira/browse/SPARK-12036
2) Spark CSV - не найден подходящий конструктор / метод для фактических параметров
Ниже приведен код, который я пробовал. Он содержит 3 файла. Первый - это основной код драйвера Spark. Второй - это класс Person Java, который определяет JSON, с которым я хочу разобраться и работать с ним. Третий файл - это сам JSON. В конце я также включил зависимость Spark от моего pom.xml
Файл 1: Основной код драйвера Spark Java
package com.suraj.spark;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Encoder;
import org.apache.spark.sql.Encoders;
import org.apache.spark.sql.SparkSession;
import com.suraj.spark.pojos.Person;
public class PersonTest {
public static void main(String... args) {
SparkSession spark = SparkSession.builder().master("local").appName("Simple Application")
.getOrCreate();
Encoder<Person> pe = Encoders.bean(Person.class);
Dataset<Person> pdf = spark.read().json("person.json").as(pe);
pdf.show(); // This works
JavaRDD<Person> prdd = pdf.toJavaRDD();
System.out.println(prdd.take(1)); // This fails.
}
}
Файл 2: Класс person, который определяет мой JSON
package com.suraj.spark.pojos;
import java.io.Serializable;
public class Person implements Serializable {
private Integer age;
private String name;
private Double height;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getHeight() {
return height;
}
public void setHeight(Double height) {
this.height = height;
}
}
Файл 3: Файл, содержащий мою строку JSON. Сохраните это в корне проекта.
{"name":"ravi","age":14,"height":6.4}
{"name":null,"age":12,"height":null}
Файл 4: Выдержки из моего pom.xml
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.4.4</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.4</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>org.apache.curator</groupId>
<artifactId>apache-curator</artifactId>
</exclusion>
</exclusions>
</dependency>
Ожидаемый = Это должно быть в состоянии напечатать вывод метода take (1).
Actual Result = Это ошибка из-за ошибки времени компиляции со стеком ниже
Caused by: java.util.concurrent.ExecutionException: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 57, Column 37: failed to compile: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 57, Column 37: No applicable constructor/method found for actual parameters "long"; candidates are: "public static java.lang.Integer java.lang.Integer.valueOf(int)", "public static java.lang.Integer java.lang.Integer.valueOf(java.lang.String) throws java.lang.NumberFormatException", "public static java.lang.Integer java.lang.Integer.valueOf(java.lang.String, int) throws java.lang.NumberFormatException"