繁体   English   中英

Spark SQL Dataframe- java.lang.ArrayIndexOutOfBoundsException 错误

[英]Spark SQL Dataframe- java.lang.ArrayIndexOutOfBoundsException error

使用 spark java 我在逗号分隔符源文件上创建了数据框。 在源文件中,如果最后一列包含空白值,则其抛出arrayindexoutofbound错误。 下面是示例数据和代码。 有什么办法可以处理这个错误,因为有很多机会在最后一列中获得空白值。 在下面的示例数据中,第 4 行导致问题。

样本数据:

1,viv,chn,34
2,man,gnt,56
3,anu,pun,22
4,raj,bang,*

代码:

        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);
                 }); 


        }
    }

我使用了 spark 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();

完全使用您拥有的行并且它工作正常:查看输出:

在此处输入图片说明

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM