Почему исключение не генерируется немедленно в Spark Dataframe show () при несоответствии схемы, если это действие? - PullRequest
0 голосов
/ 27 мая 2020

Я использую Java и

compile group: 'org.apache.spark', name: 'spark-core_2.11', version: '2.4.4'
compile group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.4.4'

У меня есть набор строк:

 Dataset<Row> ds = spark.read().json(path);

Который я могу show () и printShema () ;

Теперь я создаю новый набор данных своих POJO:

  Dataset<MyPOJO> ds2 =
                ds
                  .select(col("myCol").as("customers"))
                  .as(Encoders.bean(MyPOJO.class));

MyPOJO имеет поле, String[] customers.

Теперь я использую ds2.show () и ds2.printSchema ():

+--------------------+
|           customers|
+--------------------+
|     [[NASA], [ORS]]|
 ....


root
 |-- customers: array (nullable = true)
 |    |-- element: array (containsNull = true)
 |    |    |-- element: string (containsNull = true)

Я вижу несоответствие схемы. Фактически, customers - это массив массивов, а не массив. Однако в этот момент исключение не создается.

Теперь я пытаюсь:

 ds2.filter((FilterFunction<MyPOJO>) (i -> i.customers.length == 1)).show();

И здесь возникает исключение:

 Column 40: Cannot cast "org.apache.spark.sql.catalyst.util.ArrayData" to "org.apache.spark.unsafe.types.UTF8String"

Я понял, в чем проблема (несоответствие схемы) и исправил это с помощью функции flatten () .

Мой вопрос: почему исключение не возникает немедленно в момент ds2.show(), и фрейм данных действительно печатается, если show () - это действие, вызываемое в фрейме данных (df2) POJO с несоответствием схемы ?

...