Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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
Spark:如何用Scala或Java用户定义函数映射Python?_Java_Python_Scala_Apache Spark_Pyspark - Fatal编程技术网

Spark:如何用Scala或Java用户定义函数映射Python?

Spark:如何用Scala或Java用户定义函数映射Python?,java,python,scala,apache-spark,pyspark,Java,Python,Scala,Apache Spark,Pyspark,比如说,我的团队选择Python作为使用Spark开发的参考语言。但后来出于性能原因,我们希望开发特定的Scala或Java库,以便用Python代码将它们映射到类似于带有Scala或Java骨架的Python存根的东西 你不认为有可能将新的定制Python方法与一些Scala或Java用户定义函数接口吗?Spark 2.1+ 您可以使用: 注册JavaUDF,以便在SQL语句中使用它 它需要一个名称、Java类的完全限定名和可选的返回类型。不幸的是,目前它只能在SQL语句中或与expr/sel

比如说,我的团队选择Python作为使用Spark开发的参考语言。但后来出于性能原因,我们希望开发特定的Scala或Java库,以便用Python代码将它们映射到类似于带有Scala或Java骨架的Python存根的东西

你不认为有可能将新的定制Python方法与一些Scala或Java用户定义函数接口吗?

Spark 2.1+

您可以使用:

注册JavaUDF,以便在SQL语句中使用它

它需要一个名称、Java类的完全限定名和可选的返回类型。不幸的是,目前它只能在SQL语句中或与expr/selectExpr一起使用,并且需要Java org.apache.spark.SQL.api.Java.UDF*:

标度厌恶度:=2.11.8 libraryDependencies++=Seq org.apache.spark%%spark sql%2.1.0 包com.example.spark.udfs 导入org.apache.spark.sql.api.java.UDF1 类addOne扩展UDF1[整数,整数]{ def callx:Integer=x+1 } sqlContext.registerJavaFunctionadd_one,com.example.spark.udfs.addOne sqlContext.sqlSELECT add_one1.show +---+ |UDF1| +---+ | 2| +---+ 独立版本:

我不想说它得到了支持,但它确实是可能的。PySpark中当前可用的所有SQL函数都只是Scala API的包装器

假设我想重用我创建的GroupConcat UDAF作为答案,它位于包com.example.UDAF中:

从pyspark.sql.column导入列,_到_java_列,_到_seq 从pyspark.sql导入行 行=行,v df=sc.parallelize[ 第1行,第1行,第1行,第2行,第1行,第2行,第2行,第2行].toDF def groupConcatcol: 对给定列的值进行分组和连接 >>>df=sqlContext.createDataFrame[1,foo,2,bar],k,v >>>df.selectgroupConcatv.aliasvs [Rowvs=u'foo,bar'] sc=SparkContext.\u活动\u spark\u上下文 可以使用java_导入来避免完整的包路径 _groupConcat=sc.\u jvm.com.example.udaf.groupConcat.apply 转换为Seq以匹配applyexprs:列* 将列_groupConcat _返回到_seqsc,[col],_返回到_java _列 df.groupByk.agggroupConcatv.aliasvs.show +--+-----+ |k | vs| +--+-----+ |1 | foo1,foo2| |2 |巴1,巴2| +--+-----+ 对于我的口味来说,有太多的主要下划线,但正如你所看到的,这是可以做到的

有关:


我正在执行以下操作,但每次遇到py4j.protocol.Py4JError:com.example.udf.GroupConcat.apply时,JVM中都不存在。我的包是com.example.udfI,它有一个包含enum常量和UDF的jar。如何修改此代码以使用它?我缺少一些关于registerJavaFunction如何知道在何处查找您的UDF的信息。。。你能详细说明一下目录结构吗?你有没有清理过你的鳞片。。。构建。sbt??和包com.example.spark.udfs。。。src/main/scala??来自其他目录的文件?其他地方?值得注意的是,您应该首先检查您的Scala和Spark版本是否兼容。。。我第一天就用了整整一天的时间使用sbt