在Spark中解析丢失的列值CSV

时间:2015-06-16 01:34:34

标签: csv apache-spark apache-spark-sql

我有一个包含大约270列的巨大数据库导入表,我创建了一个JavaRDD并用它来填充数据帧。

场景:如果CSV文件中的所有字段都存在,那么一切都很棒。但是如果CSV中有一些空字段,例如。

Value1,,,,,,value7,,,,, 
然后,由于Indexoutofbound异常(列>行大小),在写入hive表存储的镶木地板时失败。我不想使用spark-csv库。

我尝试使用过滤器,但没有用,因为我需要所有列,即使CSV中没有数据也是如此。如果我遗失某些事情,请告诉我。

JavaRDD<String> tLogRDD =jsc.textFile(dataFile);    
        String schema=tLogRDD.first();

            List<StructField> columns =new ArrayList<StructField>();
            for(String fieldName: schema.split(","))
            {               
            columns.add(DataTypes.createStructField(fieldName,DataTypes.StringType,false));
            }                   
        StructType schemaStructType = DataTypes.createStructType(columns);
        System.out.println("XXXXXXXXXXXX-Row Read Start-XXXXXXXXXXXXXXX");
        @SuppressWarnings("serial")
        JavaRDD<Row> rowRDD = tLogRDD.map(
                  new Function<String, Row>() {
                      @Override
                    public Row call(String record) throws Exception {
                      String[] fields = record.split(",");
                      Object[] fields_converted = fields;
                      return RowFactory.create(fields_converted);                 
                    }
                  });
        //apply schema to rows  
        DataFrame tLogfDataFrame=hContext.createDataFrame(rowRDD, schemaStructType);
        System.out.println("DataFrame Constructed Successfully");
        tLogfDataFrame.show(10);
        tLogfDataFrame.save("C:/Users/Documents/1001.csv","parquet");

1 个答案:

答案 0 :(得分:0)

您可以使用Spark的csv阅读器, 喜欢:

sparkSession.read()
.format("csv")
.option("header","true")
.option("inferSchema","true")
.load(--file path--)

这更容易,并且具有一组选项。