用于扩展com.sun.jna.Structure的Java类的Spark bean编码器
我正在使用JNA从Spark UDF中运行一些本机代码。目前,我将这些手动映射到要从UDF返回的Scala案例类上(模式是自动推断的)。这会导致大量代码重复,因为数据结构几乎相同 因此,我声明了一组Java类来映射本机数据结构(这些类需要从用于扩展com.sun.jna.Structure的Java类的Spark bean编码器,java,apache-spark,jna,Java,Apache Spark,Jna,我正在使用JNA从Spark UDF中运行一些本机代码。目前,我将这些手动映射到要从UDF返回的Scala案例类上(模式是自动推断的)。这会导致大量代码重复,因为数据结构几乎相同 因此,我声明了一组Java类来映射本机数据结构(这些类需要从com.sun.jna.Structure继承),它们如下所示: public class MyStruct extends com.sun.jna.Structure { public double[] cp_O = new double[3];
com.sun.jna.Structure
继承),它们如下所示:
public class MyStruct extends com.sun.jna.Structure {
public double[] cp_O = new double[3];
public int B_HN;
public double B_Yo;
public double B_DY;
@Override
protected List getFieldOrder() {
return Arrays.asList("cp_O","B_HN","B_Yo","B_DY");
}
}
接下来,为了使用org.apache.spark.sql.Encoders.bean
,我为这个类添加了getter和setter(使其成为bean),并尝试:
implicit val encoder = Encoders.bean(classOf[MyStruct])
// dummy udf without native call, just return a Bean
val myUDF = udf(() => new MyStruct(),encoder.schema)
ss.range(1)
.withColumn("result",myUDF())
.show()
这使得:
线程“main”java.lang.NullPointerException中的异常位于
org.spark_project.guava.reflect.TypeToken.method(TypeToken.java:465)
在
org.apache.spark.sql.catalyst.JavaTypeInference$$anonfun$2.apply(JavaTypeInference.scala:126)
在
org.apache.spark.sql.catalyst.JavaTypeInference$$anonfun$2.apply(JavaTypeInference.scala:125)
在
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
在
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
在
scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
在
scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
在
scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
位于scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:108)
在
org.apache.spark.sql.catalyst.JavaTypeInference$.org$apache$spark$sql$catalyst$JavaTypeInference$$inferDataType(JavaTypeInference.scala:125)
在
org.apache.spark.sql.catalyst.JavaTypeInference$.inferDataType(JavaTypeInference.scala:55)
在
org.apache.spark.sql.catalyst.encoders.ExpressionEncoder$.javaBean(ExpressionEncoder.scala:89)
位于org.apache.spark.sql.Encoders$.bean(Encoders.scala:142)
如果我从我的类中删除
扩展结构
,那么对于spark代码运行良好,但对于JNA代码运行不好。显然,Structure
向MyStruct
添加了许多字段,其中一个字段不受支持/无法映射。由于我不需要这些字段,我如何制定我的代码,以便只对MyStruct
中的“我的”字段进行编码,而不是从Structure
继承的字段进行编码?我建议您将此问题交叉发布到,以获得更多的可见性。