使用insertIntoJDBC发出Spark问题

时间:2015-05-14 11:59:41

标签: java apache-spark apache-spark-sql

我尝试使用新的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

1 个答案:

答案 0 :(得分:0)

java反射不保证属性的排序。请参考javadoc进行反射。这里spark试图通过反射来拉动你的pojo的属性。 但是,还有另一种方法可以通过structtype模式创建df,其中表列的排序将保持不变。