我在用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确实被打印了?
暂无答案!
目前还没有任何答案,快来回答吧!