Spark не удается сопоставить JSON Integer с Java Integer - PullRequest
1 голос
/ 18 октября 2019

У меня есть класс 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"

1 Ответ

0 голосов
/ 18 октября 2019

Это не Integer, который вы получаете, а Long.

No applicable constructor/method found for actual parameters "long";

Он пытается найти методы, подобные new Integer(long), чтобы конвертировать его, но его нет, так какконверсия с потерями. Измените Person.age на Long, и оно будет работать (самый простой вариант).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...