我正在使用 Scala,并希望构建自己的数据帧函数。例如,我想将一列视为数组,循环访问每个元素并进行计算。
首先,我尝试实现自己的getMax方法。因此列x的值为[3,8,2,5,9],该方法的预期输出为9。
下面是它在Scala中的样子
def getMax(inputArray: Array[Int]): Int = {
var maxValue = inputArray(0)
for (i <- 1 until inputArray.length if inputArray(i) > maxValue) {
maxValue = inputArray(i)
}
maxValue
}
这是我目前所知道的,并得到这个错误
"value length is not a member of org.apache.spark.sql.column",
我不知道如何迭代该列。
def getMax(col: Column): Column = {
var maxValue = col(0)
for (i <- 1 until col.length if col(i) > maxValue){
maxValue = col(i)
}
maxValue
}
一旦我能够实现自己的方法,我将创建一个列函数
val value_max:org.apache.spark.sql.Column=getMax(df.col(“value”)).as(“value_max”)
然后我希望能够在SQL的陈述中使用它
val sample = sqlContext.sql("SELECT value_max(x) FROM table")
给定输入列[3,8,2,5,9],预期输出将是9
我遵循另一个线程Spark Scala的答案-我如何迭代数据帧中的行,并将计算值添加为数据帧的新列,其中它们为标准偏差创建了一个私有方法。我将要做的计算将比这更复杂(例如,我将比较列中的每个元素),我的方向是否正确,还是应该更多地研究用户定义的函数?
在优秀的留档中给出了一个简单的例子,其中一整个部分专门用于UDF:
import org.apache.spark.sql._
val df = Seq(("id1", 1), ("id2", 4), ("id3", 5)).toDF("id", "value")
val spark = df.sparkSession
spark.udf.register("simpleUDF", (v: Int) => v * v)
df.select($"id", callUDF("simpleUDF", $"value"))
在Spark DataFrame中,您不能使用您想到的方法遍历列的元素,因为列不是可迭代的对象。
但是,要处理列的值,您有一些选项,正确的选项取决于您的任务:
1)使用现有的内置函数
Spark SQL已经有很多用于处理列的有用函数,包括聚合和转换函数。其中大多数可以在< code>functions包中找到(此处为文档)。其他一些函数(一般是二进制函数)可以直接在< code>Column对象中找到(这里是文档)。所以,如果你能使用它们,通常是最好的选择。注意:不要忘记窗口函数。
2)创建UDF
如果无法使用内置函数完成任务,则可以考虑定义 UDF(用户定义函数)。如果您可以独立处理列的每个项目,并且希望生成与原始列具有相同行数的新列(而不是聚合列),则它们非常有用。这种方法非常简单:首先,定义一个简单的函数,然后将其注册为UDF,然后使用它。例:
def myFunc: (String => String) = { s => s.toLowerCase }
import org.apache.spark.sql.functions.udf
val myUDF = udf(myFunc)
val newDF = df.withColumn("newCol", myUDF(df("oldCol")))
要了解更多信息,这里有一篇很好的文章。
3) 使用UDAF
如果您的任务是创建聚合数据,则可以定义UDAF(用户定义的聚合函数)。我在这方面没有太多经验,但我可以为您指出一个很好的教程:
https://ragrawal . WordPress . com/2015/11/03/spark-custom-udaf-example/
4) 回退到 RDD 处理
如果您真的不能使用上面的选项,或者如果您的处理任务依赖于不同的行来处理,并且它不是一个聚合,那么我认为您必须选择您想要的列,并使用相应的RDD来处理它。示例:
val singleColumnDF = df("column")
val myRDD = singleColumnDF.rdd
// process myRDD
所以,这是我能想到的选择。希望有帮助。
主要内容:函数定义函数是一组可重复使用的代码,可以在程序中的任何地方调用。这消除了一遍又一遍地编写相同的代码的需要。这使程序员能够将一个大程序划分成许多小的可管理的功能模块。 除了内置函数外,VBA还允许编写用户定义的函数。 在本章中,我们将学习如何在VBA中编写自己的函数。 函数定义 一个VBA函数可以有一个可选的语句。如果要从函数返回值,则可使用语句。 例如,可以在一个函数中传递两个数字,然后从函数中返回它们的
我做了这个自定义函数,并把它放在全局之外,这通常会工作。我也试着在主异步木偶函数中移动它,但也不起作用。这是一个简单的函数。在每个page evaluate函数中,我调用它并传递选择器。但是,它的说法没有定义和promise拒绝,这是奇怪的,因为函数不是promise....请帮助 我尝试将函数转换为异步函数,添加了一个新的参数页。然后,我将async添加到我的评估函数中,然后将puppeteer
$this->db->call_function(); 这个方法用于执行一些 CodeIgniter 中没有定义的 PHP 数据库函数,而且 使用了一种平台独立的方式。举个例子,假设你要调用 mysql_get_client_info() 函数,这个函数 CodeIgniter 并不是原生支持的,你可以这样做: $this->db->call_function('get_client_info')
问题内容: 我正在处理大量旧数据(从平面文件db转换),其中字段的格式设置为输入记录的年份的最后2位,然后是4位的增量… 例如,1998年创建的第三条记录将为“ 980003”,而2004年创建的第十一条记录将为“ 040011”。 我无法更改这些值- 它们通过他们的公司存在,已经在州,客户等中注册。我知道将年份和其余年份分隔到单独的列中会很好,但这是不可能的。我什至不能真正做到“内部”,因为每一
XQuery提供编写自定义函数的功能。 下面列出了创建自定义函数的准则。 使用关键字来定义函数。 使用当前XML架构中定义的数据类型 将函数体包含在花括号内。 使用XML命名空间前缀函数的名称。 创建自定义函数时使用以下语法。 语法 示例 以下示例显示如何在XQuery中创建用户定义的函数。 XQuery表达式 输出结果 - 验证结果 要测试上述函数,用上面的XQuery表达式替换books.xq
我在理解group_by如何在tidyverse中工作时遗漏了一些东西。示例将阐明: 我已经创建了下面的函数,它采用很少的参数,并计算tibble内部的最佳权重(可能不是最漂亮的,但似乎工作): 当我在tibble中只有一个组时,这个函数可以很好地工作。我创建函数的方法是尝试通过在一个函数上进行测试来实现它,希望在我稍后对数据进行切片时它会起作用。 然后,我希望可以使用mutate为我的多个组创建