Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于扩展com.sun.jna.Structure的Java类的Spark bean编码器_Java_Apache Spark_Jna - Fatal编程技术网

用于扩展com.sun.jna.Structure的Java类的Spark bean编码器

用于扩展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];

我正在使用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];
  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
继承的字段进行编码?

我建议您将此问题交叉发布到,以获得更多的可见性。