【发布时间】:2016-03-06 04:44:33
【问题描述】:
我似乎无法为镶木地板写信 JavaRDD<T> 其中 T 表示 Person 类。我把它定义为
public class Person implements Serializable
{
private static final long serialVersionUID = 1L;
private String name;
private String age;
private Address address;
....
Address:
public class Address implements Serializable
{
private static final long serialVersionUID = 1L;
private String City; private String Block;
...<getters and setters>
然后我像这样创建一个JavaRDD:
JavaRDD<Person> people = sc.textFile("/user/johndoe/spark/data/people.txt").map(new Function<String, Person>()
{
public Person call(String line)
{
String[] parts = line.split(",");
Person person = new Person();
person.setName(parts[0]);
person.setAge("2");
Address address = new Address("HomeAdd","141H");
person.setAddress(address);
return person;
}
});
注意 - 我手动将 Address 设置为对所有人都相同。这基本上是一个嵌套的 RDD。在尝试将其保存为镶木地板文件时:
DataFrame dfschemaPeople = sqlContext.createDataFrame(people, Person.class);
dfschemaPeople.write().parquet("/user/johndoe/spark/data/out/people.parquet");
地址类是:
import java.io.Serializable;
public class Address implements Serializable
{
public Address(String city, String block)
{
super();
City = city;
Block = block;
}
private static final long serialVersionUID = 1L;
private String City;
private String Block;
//Omitting getters and setters
}
我遇到了错误:
原因:java.lang.ClassCastException:com.test.schema.Address 无法转换为 org.apache.spark.sql.Row
我正在运行 spark-1.4.1。
- 这是一个已知的错误吗?
- 如果我通过导入相同格式的嵌套 JSON 文件来做同样的事情,我可以保存到镶木地板。
- 即使我创建了一个子 DataFrame,例如:
DataFrame dfSubset = sqlContext.sql("SELECT address.city FROM PersonTable");,我仍然会遇到同样的错误
那是什么?如何从文本文件中读取复杂的数据结构并保存为镶木地板?看来我做不到。
【问题讨论】:
-
我这样做了,没有任何问题。它输出到标准输出:
System.out.println(dfschemaPeople.count());当保存到镶木地板时,我得到了这个错误。请注意,如果我有 JSON 数据可以写入镶木地板,那么只有类对象我不能。
标签: java apache-spark apache-spark-sql parquet