2017-10-16 132 views
0

使用java的火花,我創建的逗號分隔符源file.In的資源文件數據幀,如果最後一列,然後空值的投擲arrayindexoutofbound error.Below是樣本數據和code.is有什麼我可以處理這個錯誤的方式,因爲在最後一欄中有很多機會獲得空白值。在下面的示例數據第四行導致問題。星火SQL Dataframe- java.lang.ArrayIndexOutOfBoundsException錯誤

示例數據

1,VIV,CHN,34

2,人,GNT,56

3,ANU,雙關,22

** 4,拉吉,砰*

JavaRDD<String> dataQualityRDD = spark.sparkContext().textFile(inputFile, 1).toJavaRDD(); 
    String schemaString = schemaColumns; 
    List<StructField> fields = new ArrayList<>(); 
    for (String fieldName : schemaString.split(" ")) { 
     StructField field = DataTypes.createStructField(fieldName, DataTypes.StringType, true); 
     fields.add(field); 
    } 
    StructType schema = DataTypes.createStructType(fields); 

    JavaRDD<Row> rowRDD = dataQualityRDD.map((Function<String, Row>) record -> { 
       // String[] attributes = record.split(attributes[0], attributes[1].trim()); 
       Object[] items = record.split(fileSplit); 

       // return RowFactory.create(attributes[0], attributes[1].trim()); 
         return RowFactory.create(items); 
      }); 




    } 
} 

回答

1

我用火花2.0,並能夠讀取CSV沒有任何異常:

 SparkSession spark = SparkSession.builder().config("spark.master", "local").getOrCreate(); 
    JavaSparkContext jsc = JavaSparkContext.fromSparkContext(spark.sparkContext()); 

    JavaRDD<Row> csvRows = spark.read().csv("resources/csvwithnulls.csv").toJavaRDD(); 

    StructType schema = DataTypes.createStructType(
      new StructField[] { new StructField("id", DataTypes.StringType, false, Metadata.empty()), 
        new StructField("fname", DataTypes.StringType, false, Metadata.empty()), 
        new StructField("lname", DataTypes.StringType, false, Metadata.empty()), 
        new StructField("age", DataTypes.StringType, false, Metadata.empty()) }); 

    Dataset<Row> newCsvRows = spark.createDataFrame(csvRows, schema); 
    newCsvRows.show(); 

二手正是你有行和它工作得很好:看到輸出:

enter image description here

enter image description here

+0

REF:https://medium.com/@mrpowers/sparks-treatment -of-empty-strings-and-null-values-in-csv-files -80748893451f – skvyas

+0

基於源文件,我將傳遞由另一個job.sql查詢動態生成的sql查詢,這將有助於我瞭解列信息並提供錯誤記錄。 – vivman

+0

如果我誤解了你的問題,我很抱歉。但是,無論哪種情況,您都可以像上面那樣創建一個Dataset,然後將您的查詢傳遞給您已經擁有的參數,我認爲這個參數之一?通過將數據集註冊爲臨時表可以執行任何進一步的轉換/操作?所以,簡而言之,你必須保持源文件查詢+其他params地圖或其他東西? – skvyas