【发布时间】:2017-06-06 09:58:47
【问题描述】:
我希望能够在 PySpark 中将 Scala 函数用作 UDF
package com.test
object ScalaPySparkUDFs extends Serializable {
def testFunction1(x: Int): Int = { x * 2 }
def testUDFFunction1 = udf { x: Int => testFunction1(x) }
}
我可以在 PySpark 中访问 testFunction1 并让它返回值:
functions = sc._jvm.com.test.ScalaPySparkUDFs
functions.testFunction1(10)
我希望能够将此函数用作 UDF,最好是在 withColumn 调用中:
row = Row("Value")
numbers = sc.parallelize([1,2,3,4]).map(row).toDF()
numbers.withColumn("Result", testUDFFunction1(numbers['Value']))
我认为这里有一个很有前途的方法: Spark: How to map Python with Scala or Java User Defined Functions?
但是,当对那里找到的代码进行更改时,请改用testUDFFunction1:
def udf_test(col):
sc = SparkContext._active_spark_context
_f = sc._jvm.com.test.ScalaPySparkUDFs.testUDFFunction1.apply
return Column(_f(_to_seq(sc, [col], _to_java_column)))
我明白了:
AttributeError: 'JavaMember' object has no attribute 'apply'
我不明白这一点,因为我相信testUDFFunction1 确实有一个 apply 方法?
我不想使用此处找到的类型的表达式: Register UDF to SqlContext from Scala to use in PySpark
任何关于如何完成这项工作的建议都将不胜感激!
【问题讨论】:
标签: python scala apache-spark pyspark apache-spark-sql