我尝试使用新的Dataframe API进行开发,但我还是 得到错误。
我有一个现有的oracle数据库,我想插入行。 我从RDD创建一个Dataframe,然后使用" insertIntoJDBC"功能。 似乎数据帧重新排序其中的数据。 结果,我收到一个错误,因为字段没有插入 正确 顺序。
有没有办法在里面指定我的变量的名称或顺序 数据库?
如果是错误,这里有一个重现它的例子:
import java.io.Serializable;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.SQLContext;
public class ErilView implements Serializable {
private static final String CONNECTION_URL = "jdbc:oracle:<drivertype>:<user>/<password>@<database>";
private static final String TABLE_NAME = "TABLE_NAME";
private static final JavaSparkContext sc = new JavaSparkContext(
new SparkConf().setAppName("ErilView"));
private static final SQLContext sqlContext = new org.apache.spark.sql.SQLContext(
sc);
public static void main(String[] args) {
JavaRDD<Person> rows = sc.textFile("path/dataset/sample.txt").map(
new Function<String, Person>() {
public Person call(String line) throws Exception {
String[] fields = line.split("|");
Person person = new Person();
person.setName(fields[0]);
person.setAge(Integer.parseInt(fields[1].trim()));
return person;
}
});
DataFrame schemaPeople = sqlContext.createDataFrame(rows, Person.class);
// Option 1: Create new table and insert all records.
schemaPeople.createJDBCTable(CONNECTION_URL, TABLE_NAME, true);
// Option 2: Insert all records to an existing table.
schemaPeople.insertIntoJDBC(CONNECTION_URL, TABLE_NAME, false);
}
}
请让我知道以正确的顺序填充数据的任何方式。
先谢谢 --Chaitu
答案 0 :(得分:0)
java反射不保证属性的排序。请参考javadoc进行反射。这里spark试图通过反射来拉动你的pojo的属性。 但是,还有另一种方法可以通过structtype模式创建df,其中表列的排序将保持不变。