Я использую 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 с несоответствием схемы ?