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
Apache spark UDF中的Spark classnotfoundexception_Apache Spark_Apache Spark Sql_User Defined Functions - Fatal编程技术网

Apache spark UDF中的Spark classnotfoundexception

Apache spark UDF中的Spark classnotfoundexception,apache-spark,apache-spark-sql,user-defined-functions,Apache Spark,Apache Spark Sql,User Defined Functions,当我调用一个函数时,它就工作了。但是,当我在UDF中调用该函数时,它将不起作用 这是完整的代码 val sparkConf=new sparkConf.setAppNameHiveFromSpark.setPark.driver.allowMultipleContexts,true val sc=新的SparkContextsparkConf val hive=new org.apache.spark.sql.hive.HiveContextsc /////////////自定义项 def to

当我调用一个函数时,它就工作了。但是,当我在UDF中调用该函数时,它将不起作用

这是完整的代码

val sparkConf=new sparkConf.setAppNameHiveFromSpark.setPark.driver.allowMultipleContexts,true val sc=新的SparkContextsparkConf val hive=new org.apache.spark.sql.hive.HiveContextsc /////////////自定义项 def todoublearrayfunnec:Any:scala.Array[Double]={ 将[WrappedArray[Double]]的向量安装返回阵列 } def toDoubleArray=udfvec:Any=>todoublearrayfunnec ////////////过程 var df=hive.sqlselect vec from mst_wordvector_tapi_128dim where word='soccer' println===测试获取值然后转换 printlndf.head.get0 printlntoDoubleArrayFundf.head.get0 println==通过udf进行测试转换 df.带第五列文字,toDoubleArraycolvec .show10; 然后这就是输出

sc: org.apache.spark.SparkContext = org.apache.spark.SparkContext@6e9484ad
hive: org.apache.spark.sql.hive.HiveContext = 
toDoubleArrayFun: (vec: Any)Array[Double]
toDoubleArray: org.apache.spark.sql.UserDefinedFunction
df: org.apache.spark.sql.DataFrame = [vec: array<double>]
==== test get value then transform
WrappedArray(-0.88675,, 0.0216657)
[D@4afcc447
==== test transform by udf
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 2.0 failed 4 times, most recent failure: Lost task 0.3 in stage 2.0 (TID 5, xdad008.band.nhnsystem.com): java.lang.ClassNotFoundException: $iwC$$iwC$$iwC$$iwC$$iwC$$$$5ba2a895f25683dd48fe725fd825a71$$$$$$iwC$$anonfun$toDoubleArray$1
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
输出

df: org.apache.spark.sql.DataFrame = [vec: array<double>]
root
|-- vec: array (nullable = true)
|    |-- element: double (containsNull = true)
==== test get value then transform
word_vec: Any = WrappedArray(-0.88675,...7)
<console>:288: error: overloaded method value dense with alternatives:
(values: Array[Double])org.apache.spark.mllib.linalg.Vector <and>
(firstValue: Double,otherValues:Double*)org.apache.spark.mllib.linalg.Vector
cannot be applied to (Any)
println(Vectors.dense(word_vec))
这意味着无法将配置单元“数组”列强制转换为数组 实际上,我想计算距离:双精度双数组列。 如何基于数组列添加向量列

典型的方法是

Vectors.sqrt(Vectors.dense(Array<Double>, Array<Double>)
由于udf函数必须执行序列化和反序列化过程,所以任何数据类型都无法工作。您必须定义要传递给udf函数的列的确切数据类型

从您问题中的输出来看,您的数据帧中似乎只有一列,即vec,它是Array[Double]类型


因为不需要序列化和反序列化过程,所以它只是scala函数调用

啊,可序列化才是重点!但如何制作dataframe列数组,而不是任何列?我已经更新了问题!只需将数据类型定义为WrappedArray[Double],而不是udf函数中的任何数据类型,就可以了谢谢你友好的回答。。顺便说一句,当我将参数类型设置为WrappedArray[Double]而不是任何参数时,它会失败:346:错误:类型不匹配;发现:任何。必需:scala.collection.mutable.WrappedArray[Double]println Vectors.densetodooublearrayfundf.head.get0i必须逐步了解您正在做的事情。如果你再次更新这个问题,那么这个问题就会变得一团糟。因此,我建议你提出另一个问题,一步一步地解决你的问题和当前的问题。如果别人不回答,我会尽力回答。如果这个答案对你有帮助,请接受并投票谢谢
df: org.apache.spark.sql.DataFrame = [vec: array<double>]
println(toDoubleArrayFun(df.head().get(0)))