Набор данных Spark, читающий CSV с отсутствующим столбцом - PullRequest
0 голосов
/ 29 января 2020

Предположим, у меня есть

public class A {
    int    field1;
    String field2;
    double field3;
    int    field4;

// getters and setters
}

Тем не менее, у меня есть файлы CSV, которые имеют только

field1,field2,field3
field1,field2,field3
field1,field2,field3
...

Как мне получить искру, чтобы прочитать CSV и преобразовать в бин A, не жалуясь на отсутствует field4?

sqlContext
     .read()
     .schema(schema)
     .csv(inputFile)
     .as(Encoders.bean(A.class));

Он жалуется на

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve '`field4`' given input columns: [field1, field2, field3];

Я пытался добавить в

sqlContext
     .read()
     .schema(schema)
     .csv(inputFile)
     .withColumn("field4", lit(1))
     .as(Encoders.bean(A.class));

, но затем жалуется на

2020/01/29 09:15:19 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
java.lang.NullPointerException: Null value appeared in non-nullable field:
currently no type path record in java
If the schema is inferred from a Scala tuple/case class, or a Java bean, please try to use scala.Option[_] or other nullable types (e.g. java.lang.Integer instead of int/scala.Int).

1 Ответ

0 голосов
/ 29 января 2020

Это похоже на проблему с тем, как вы создаете schema, который вы предоставляете.

Пожалуйста, обратитесь к фрагменту кода ниже, чтобы увидеть, работает ли он для вас.

String inputFile = "/tmp/person01.csv";
        StructField[] structFieldsFirst = new StructField[4];
        structFieldsFirst[0] = new StructField("field1", DataTypes.IntegerType, true, Metadata.empty());
        structFieldsFirst[1] = new StructField("field2", DataTypes.StringType, true, Metadata.empty());
        structFieldsFirst[2] = new StructField("field3", DataTypes.DoubleType, true, Metadata.empty());
        structFieldsFirst[3] = new StructField("field4", DataTypes.IntegerType, true, Metadata.empty());
        StructType schema = new StructType(structFieldsFirst);
        Dataset<Person> person = spark.read().schema(schema).csv(inputFile)
         .as(Encoders.bean(Person.class));

        person.show(10, false);

Класс Person такой же, как вы упомянули:

public class Person {

    int    field1;
    String field2;
    double field3;
    int    field4;

}

Ввод:

1,field2,4
2,field2,5
3,field2,6

Этот фрагмент кода возвращает следующий вывод:

+------+------+------+------+
|field1|field2|field3|field4|
+------+------+------+------+
|1     |field2|4.0   |null  |
|2     |field2|5.0   |null  |
|3     |field2|6.0   |null  |
+------+------+------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...