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

UDF斯卡拉回报[最大,指数]

秦凯定
2023-03-14

我想实现以下函数来激发SQL。给定一个数组,返回索引的最大值。我试过:

/*
 * This function finds the maximum value and corresponding index in the array. NULLs are ignored. 
 * Return type is array in format [max, index], and its element type is the same as the input type.
 * Parameters: x Array[Int]
 * Returns: Array as [max, index].
 */
def array_max_index(x: WrappedArray[Int]): WrappedArray[Int] = {
    val arr = collection.mutable.WrappedArray.empty
    arr.:+(x.max).:+(x.indexOf(x.max))
}

这很好,但仅适用于整数-我希望UDF适用于其他数值(例如Doubles)。我尝试了以下方法,但我无法返回带有类型的结构:

def array_max_index[T](item:Traversable[T])(implicit n:Numeric[T]): Traversable[T] = {
    val arr = collection.mutable.WrappedArray.empty
    val max = item.max
    val index = n.toInt(item.toSeq.indexOf(max))
    arr.:+(max).:+(index)
  }

有什么想法吗?

共有1个答案

艾弘义
2023-03-14

返回<code>数组,并且最大值类型取决于特定调用(如果我理解正确,您希望它能很好地用于整数和双精度)-因此无法正确键入数组。

以下是UDF的一个可能实现,返回元组:

def array_max_index[T](x: Traversable[T])(implicit n: Numeric[T]): (T, Int) = {
  (x.max, x.toSeq.indexOf(x.max))
}

然后,可以为s 和 Ints 调用:

sqlContext.udf.register("array_max_index", array_max_index(_: Traversable[Double]))

sqlContext.sql(
  """SELECT array_max_index(array(
    |  CAST(5.0 AS DOUBLE),
    |  CAST(7.0 AS DOUBLE),
    |  CAST(3.0 AS DOUBLE)
    |)) as max_and_index""".stripMargin).show

哪些打印:

+-------------+
|max_and_index|
+-------------+
|      [7.0,1]|
+-------------+
 类似资料:
  • 请看下面的代码,让我知道我哪里做错了? 使用: DSE版本-5.1.0 172.31.16.45:9042连接到测试群集。[cqlsh 5.0.1|Cassandra3.10.0.1652|DSE 5.1.0|CQL规范3.4.4|本地协议v4]使用HELP寻求帮助。 谢谢 斯卡拉 斯卡拉 斯卡拉 我在这里什么都得不到?甚至没有错误。

  • 我有一个用斯卡拉写的UDF,我希望能够通过Pyspark会话调用它。UDF 采用两个参数:字符串列值和第二个字符串参数。我已经能够成功地调用UDF,如果它只需要一个参数(列值)。如果需要多个参数,我很难调用UDF。以下是到目前为止我在斯卡拉和Pyspark中能够做的事情: Scala UDF: 在Scala中使用它时,我已经能够注册和使用这个UDF: Scala主类: 以上工作成功。下面是Pysp

  • 我在eclipse中将scala项目转换为使用Maven(只需右键单击project并配置Maven build),这就创建了pom。xml,添加了正确的依赖项,它从maven存储库中提取了所需的JAR,但每当我尝试编译时,我都看不到在target\classes文件夹中生成类文件。然而,我在target\classes文件夹下的相应目录中看到了scala文件的实际源代码。我不确定它为什么要复制t

  • 基本上,我在cassandra上运行两个期货查询,然后我需要做一些计算并返回值(值的平均值)。 这是我的代码: 那么问题出在哪里呢? skus.foreach 在 ListBuffer 中追加结果值。由于一切都是异步的,当我尝试在我的主数据库中获取结果时,我得到了一个错误,说我不能被零除。 事实上,由于我的Sku.findSkusByProduct返回一个Future,当我尝试计算平均值时,卷是空

  • 我是Scala的新手,目前正在尝试使用play框架。 这是我写的工作代码: 嗯,这看起来不太好。我们能做得更好吗?我还不能。但我看到了stackoverflow的帖子:https://stackoverflow.com/a/24085333/3038183看起来很不错:) 现在我想知道如何转换我的代码,就像在给定的示例中一样。当然我已经试过了,但我无法让它编译,也不知道如何处理注释后的代码(“如何

  • 我尝试使用I forest https://github.com/titicaca/spark-iforest,的scala实现,但是当我构建时(就像README中报告的< code>mvn clean package),它给我这些错误: 有人知道为什么吗?谢谢 scala版本2.11.12 火花版本2.4.0 maven版本3.5.2 我修改了pom.xml,调整了scala、spark和mav