2015-05-14 34 views
0

我正在嘗試用新的Dataframe API進行開發,但是我的 出現錯誤。insertIntoJDBC Spark問題

我有一個現有的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

請刪除「spark-java」標記,它與Apache Spark無關,這只是令人困惑。 –

回答

0

Java反射並不保證性能的排序。請參考javadoc進行反思。這裏spark會試圖通過反射來拉動pojo的屬性。 但是,還有另一種方法可以通過structtype模式來創建df,其中表列的排序將保持不變。