首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spark未能将JSON整数映射到Java整数

Spark未能将JSON整数映射到Java整数
EN

Stack Overflow用户
提问于 2019-10-18 07:30:17
回答 1查看 491关注 0票数 1

我有一个Java类定义了我的JSON,这个类包含一些Integer属性。Spark能够读取这个JSON并使用上面的Java类编码器解析它。我还能够执行普通的Spark操作。

但是,当我试图将这个星火数据集转换为JavaRDD,或者尝试使用collectAsList或collectAsList在驱动程序上收集数据时,它会失败,并出现编译时错误。

如果我将这些整数属性转换为Long,就会开始工作.

所以,关于“星火-爪哇-整数”,我在这里遗漏了什么?

像这样的链接只是告诉解决方案,但并没有给出实际问题的理由。

1) https://issues.apache.org/jira/browse/SPARK-12036

2) Spark CSV - No applicable constructor/method found for actual parameters

下面是我尝试过的代码。它包含3个文件。第一个是主要的火花驱动程序代码。第二个是Person Java类,它定义了我想要解析和使用的JSON。第三个文件是JSON本身。最后,我还包括了我的pom.xml中的火花依赖项

文件1:主Spark驱动程序代码

代码语言:javascript
复制
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:定义我的JSON的person类

代码语言:javascript
复制
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字符串的文件。把这个放在项目的根上。

代码语言:javascript
复制
{"name":"ravi","age":14,"height":6.4}
{"name":null,"age":12,"height":null}

文件4:我的pom.xml的摘录

代码语言:javascript
复制
<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>

预期=这应该能够打印采取(1)方法的输出。

实际结果=这是失败的,下面的堆栈出现编译时错误。

代码语言:javascript
复制
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"
EN

回答 1

Stack Overflow用户

发布于 2019-10-18 07:45:51

这不是你要得到的Integer,而是Long

代码语言:javascript
复制
No applicable constructor/method found for actual parameters "long";

它试图找到像new Integer(long)这样的方法来转换它,但是没有任何方法,因为它是有损转换。将Person.age更改为Long,它将工作(最简单的选项)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58445952

复制
相关文章

相似问题

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