当前位置: 首页 > 知识库问答 >
问题:

创建Spark exists用户定义函数,其工作方式类似于Scala Array#exists函数

叶嘉颖
2023-03-14

Scala有一个Array#exists函数,工作原理是这样的:

Array(1, 2, 5).exists(_ % 2 == 0) // true

我想创建一个类似的火花存在功能。假设我们有以下< code>sourceDF:

+---------+
|     nums|
+---------+
|[1, 4, 9]|
|[1, 3, 5]|
+---------+

我希望能够写出这样的东西:

val actualDF = sourceDF.withColumn(
  "nums_has_even",
  exists(col("nums"), (x: Int) => x % 2 == 0)
)

这是我写的代码:

def existsInt(arr: Array[Int], f: (Int => Boolean)): Boolean = {
  arr.exists(f(_))
}

val exists = udf[Boolean, Array[Int], (Int => Boolean)](existsInt)

我理解为什么我的代码不工作。UDF需要列参数,匿名函数不是列对象。在<code>lit<code>中包装匿名函数不起作用:

exists(col("nums"), lit((x: Int) => x % 2 == 0)) // doesn't work

如何使此代码正常工作?

共有1个答案

强硕
2023-03-14

你很接近:

def existsInt(f: (Int => Boolean)) = udf {
  (arr: Seq[Int]) => arr.exists(f(_))  // Not Array!
}

用法:

existsInt((x: Int) => x % 2 == 0)(col("nums"))

您甚至可以:

scala.reflect.runtime.universe._

def exists[T : TypeTag](f: (T => Boolean)) = udf[Boolean, Seq[T]]{
  (arr: Seq[T]) => arr.exists(f(_))  // Not Array!
}

exists[Int]((x: Int) => x % 2 == 0).apply(col("nums"))
 类似资料:
  • 问题内容: 我正在处理大量旧数据(从平面文件db转换),其中字段的格式设置为输入记录的年份的最后2位,然后是4位的增量… 例如,1998年创建的第三条记录将为“ 980003”,而2004年创建的第十一条记录将为“ 040011”。 我无法更改这些值- 它们通过他们的公司存在,已经在州,客户等中注册。我知道将年份和其余年份分隔到单独的列中会很好,但这是不可能的。我什至不能真正做到“内部”,因为每一

  • 问题内容: 我正在寻找一个能够与TSQL的MySQL REGEX函数做相同事情的函数。基本上,我需要我的查询看起来像以下内容: 我目前不希望使用CLR。 有任何想法吗? 问题答案: 此链接是有关通过服务器上的VBScript.Regex库编写正则表达式的文章:http : //www.sqlteam.com/article/regular-expressions-in-t- sql 它通过OLE自

  • 问题内容: 这是在本地处理程序的上下文中。我想运行一个外部程序来获取一些数据。我可以使用popen()或等效函数吗? 问题答案: 然后,您可以使用流读取和写入数据。

  • 问题内容: JavaScript中是否有类似于Python的函数? 我认为应该有比每次编写以下几行更好的方法: 问题答案: 不 ,没有,但 您可以制造一个 。 JavaScript的Python实现 尝试 模拟它在Python中的工作方式 ,我将创建类似于以下的函数: 请参阅此jsfiddle以获取证明。 JavaScript和Python之间的比较 它的工作方式如下: 返回, 返回, 返回, 返

  • 我正在尝试编写一个Python实用函数,它接受本地定义类的对象,并在PySpark DataFrame<code>withColumn<code>调用中使用该类的一个方法作为用户定义函数(UDF)。实用功能签名为: 在类中,我有一个想用作UDF的方法。方法定义是: 在< code>spark_analyze中,我执行以下操作,其中< code>lp是传入的< code>LogProcessor类型

  • 是否可以像使用WordPress用户一样通过编程方式创建客户。显然,WooCommerce用户共享一些相同的WordPress用户字段,还有其他内容需要设置,如账单/邮政地址。 以前有人做到过吗?我在他们网站上的WooCommerce API/函数列表中找不到任何内容。 编辑:刚刚找到这个:http://docs.woothemes.com/wc-apidocs/function-wc_creat