java—如果异常是一个操作,为什么不在模式不匹配的情况下在spark dataframe show()中立即抛出异常?

vshtjzan  于 2021-05-27  发布在  Spark
关注(0)|答案(0)|浏览(260)

我在用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);

我可以显示()和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()是在模式不匹配的pojo的dataframe(df2)上调用的操作,那么dataframe确实被打印了?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题