我有一个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驱动程序代码
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类
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>预期=这应该能够打印采取(1)方法的输出。
实际结果=这是失败的,下面的堆栈出现编译时错误。
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"发布于 2019-10-18 07:45:51
这不是你要得到的Integer,而是Long。
No applicable constructor/method found for actual parameters "long";它试图找到像new Integer(long)这样的方法来转换它,但是没有任何方法,因为它是有损转换。将Person.age更改为Long,它将工作(最简单的选项)。
https://stackoverflow.com/questions/58445952
复制相似问题