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

2025-03-05 09:14:00
admin
原创
96
摘要:问题描述:假设我的团队已选择 Python 作为使用 Spark 进行开发的参考语言。但后来出于性能原因,我们想开发特定的 Scala 或 Java 特定库,以便将它们与我们的 Python 代码进行映射(类似于带有 Scala 或 Java 骨架的 Python 存根)。您不觉得有可能将新的定制 Pytho...

问题描述:

假设我的团队已选择 Python 作为使用 Spark 进行开发的参考语言。但后来出于性能原因,我们想开发特定的 Scala 或 Java 特定库,以便将它们与我们的 Python 代码进行映射(类似于带有 Scala 或 Java 骨架的 Python 存根)。

您不觉得有可能将新的定制 Python 方法与某些 Scala 或 Java 用户定义函数进行交互吗?


解决方案 1:

Spark 2.1+

您可以使用SQLContext.registerJavaFunction

注册一个 java UDF,以便它可以在 SQL 语句中使用。

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

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-sql" % "2.1.0"
)
package com.example.spark.udfs

import org.apache.spark.sql.api.java.UDF1

class addOne extends UDF1[Integer, Integer] {
  def call(x: Integer) = x + 1
} 
sqlContext.registerJavaFunction("add_one", "com.example.spark.udfs.addOne")
sqlContext.sql("SELECT add_one(1)").show()

## +------+
## |UDF(1)|
## +------+
## |     2|
## +------+

版本独立

我不会说它受支持,但肯定是可能的。PySpark 中当前可用的所有 SQL 函数都只是 Scala API 的包装器。

假设我想重用我创建的 UDAF 作为SPARK SQL 替换 mysql GROUP_CONCAT 聚合函数的GroupConcat答案,它位于一个包中:com.example.udaf

from pyspark.sql.column import Column, _to_java_column, _to_seq
from pyspark.sql import Row

row = Row("k", "v")
df = sc.parallelize([
    row(1, "foo1"), row(1, "foo2"), row(2, "bar1"), row(2, "bar2")]).toDF()

def groupConcat(col):
    """Group and concatenate values for a given column

    >>> df = sqlContext.createDataFrame([(1, "foo"), (2, "bar")], ("k", "v"))
    >>> df.select(groupConcat("v").alias("vs"))
    [Row(vs=u'foo,bar')]
    """
    sc = SparkContext._active_spark_context
    # It is possible to use java_import to avoid full package path
    _groupConcat = sc._jvm.com.example.udaf.GroupConcat.apply
    # Converting to Seq to match apply(exprs: Column*)
    return Column(_groupConcat(_to_seq(sc, [col], _to_java_column)))

df.groupBy("k").agg(groupConcat("v").alias("vs")).show()

## +---+---------+
## |  k|       vs|
## +---+---------+
## |  1|foo1,foo2|
## |  2|bar1,bar2|
## +---+---------+

对于我的口味来说,前导下划线太多了,但正如你所见,这是可以做到的。

相关:

  • 从任务调用 Java/Scala 函数

  • 如何在 Pyspark 中使用 Scala 类

  • 使用 Scala 转换 PySpark RDD

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3958  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2737  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   74  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   83  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   70  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用