我似乎無法寫實木複合地板JavaRDD<T>
,其中T是說,Person
類。我把它定義爲Spark SQL:鑲嵌類實木複合地板錯誤
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 dfSubset = sqlContext.sql("SELECT address.city FROM PersonTable");
我仍然得到同樣的錯誤
那麼是什麼原因?如何從文本文件中讀取複雜的數據結構並將其保存爲拼花地板?似乎我做不到。
我這樣做,並沒有問題。它輸出到標準輸出:'System.out.println(dfschemaPeople.count());'這是當保存到實木複合地板時,我得到這個錯誤。請注意,如果我有JSON數據,我可以寫入實木複合地板,只有我不能使用的類對象。 – Dan