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

使用麻木数组输入从 python 方法创建 PySpark UDF,以计算并返回单个浮点值

顾俊誉
2023-03-14

作为输入,我有一个包含整数值的csv文件。

spark_df = spark.read.option("header", "false").csv("../int_values.csv")

df = spark_df.selectExpr("_c0 as something")

_df = df.withColumn("values", df.something.cast(FloatType())).select("values")

我还有一些为numpy数组输入设计的python函数,我需要在Spark数据帧上应用这些函数。

示例一:

def calc_sum(float_array):
    return np.sum(float_array)

实函数:

def calc_rms(float_array):
    return np.sqrt(np.mean(np.diff(float_array)**2))

对于1。示例您可以像这样使用SQL sum:

_df.groupBy().sum().collect()

但是,我需要的是一个将这些函数转换成Spark UDFs的标准解决方案

我尝试了很多方法,比如:

udf_sum = udf(lambda x : calc_sum(x), FloatType())

_df.rdd.flatMap(udf_sum).collect()

但是它总是失败:

TypeError:参数无效,不是类型的字符串或列:行(值=1114.0)

有没有可能用这些函数来转换数据?

数据帧示例:

In [6]: spark_df.show()
+----+
| _c0|
+----+
|1114|
|1113|
|1066|
|1119|
|1062|
|1089|
|1093|
| 975|
|1099|
|1062|
|1062|
|1162|
|1057|
|1123|
|1141|
|1089|
|1172|
|1096|
|1164|
|1146|
+----+
only showing top 20 rows

预期输出:

从 UDF 返回的浮点值。

对于 Sum 函数,它应该很清楚。

共有1个答案

唐晗昱
2023-03-14

您需要的是groupby,并使用<code>collect_list</code>将所有整数值获取到数组列中,然后在该列上应用您的UDF。此外,您还需要显式地从<code>calc_rms<code>返回float:

from pyspark.sql import functions as F
from pyspark.sql.types import FloatType


def calc_rms(float_array):
    return float(np.sqrt(np.mean(np.diff(float_array) ** 2)))


calc_rms_udf = F.udf(calc_rms, FloatType())


df.groupby().agg(F.collect_list("_c0").alias("_c0")) \
    .select(calc_rms_udf(F.col("_c0")).alias("rms")) \
    .show()

#+--------+
#|     rms|
#+--------+
#|67.16202|
#+--------+
 类似资料:
  • 问题内容: 我目前有一种方法可以检查3x3网格中中心项周围的内容,如果8个相邻位置中的内容包含我要检查的内容,我想在长度为7的数组上将该正方形标记为1。 为此,我需要在我的方法中创建并返回一个数组,这可能吗? 问题答案: 不知道是什么问题。你是这个意思?

  • 问题内容: 在我的一项任务中,我遇到了一个奇怪的实现,我很好奇它是错误还是设计行为。 在Python 3中,除法返回浮点数,表示整数除法,应返回整数。我发现尽管在整数除法时两个值中的任何一个都是浮点数,它将返回一个浮点数。 例: 这 应该 是这样吗?如果是这样, 为什么 会这样呢? 问题答案: 从介绍了新部门(强调我的部门)的PEP-238: 楼层划分的语义 地板分割将在所有Python数字类型中

  • 我需要根据下面的说明制定一个方法。提示是“您想要多宽?”。用户输入输入,如果不是3到20之间的整数,则会弹出错误消息“预期为3到20之间的数字”。用户应该继续输入,直到给出有效答案,然后该值应该返回到main。 此方法提示用户输入一个数字,在返回该数字之前,验证该数字介于最小和最大之间。 如果输入的数字不在最小值和最大值之间,则会向用户显示一条错误消息,并给用户另一个输入数字的机会。如果最小值为1

  • 我想创建一个方法,返回用户输入值的双数组。我已经想出了如何创建一个方法,让用户选择一个数组应该包含多少个元素,然后将大小传递给下一个方法,即吐出一个由用户输入值组成的双数组。 我在这里的目标是练习学习如何使用基本方法(只是公共静态方法)来分解和解决手头的问题。 ... java包array_exercises;导入java.util.扫描仪; 公共类Array_练习{ } 预期的输出应该打印出ma

  • 我需要采取以下形式的输入得分/最大(例93/100),并将其存储为浮动变量。我遇到的问题是python做反斜杠表示的除法,因为两个数字是整数,结果是0。即使我将输入转换为浮点数,结果也是0.0。这里是我的代码供参考: 如果输入93/100,exam1变量将等于0.0,而不是预期的0.93。

  • 我正在创建一个计算器,其中每个计算器的函数都必须在一个单独的类中,并使用扫描仪输入从主方法调用。 1.加入 2.减去 3.乘法 4.分部 5.广场 6.权力 7.Mod操作 8.阶乘 0.退出 我必须创建一个对象调用的每个方法。计算器需要一个主类(有main()方法)和一个用户定义的类,该类具有上述计算方法。程序必须允许用户选择一个操作(上述计算之一)和操作数(数字)。有些计算需要两个操作数。(A