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

Apache Spark--将UDF的结果分配给多个dataframe列

彭博厚
2023-03-14

我正在使用pyspark,用spark-csv将一个大型csv文件加载到dataframe中,作为预处理步骤,我需要对其中一列(包含json字符串)中的可用数据应用各种操作。它将返回X个值,每个值都需要存储在它们自己单独的列中。

该功能将在UDF中实现。但是,我不确定如何从该UDF返回一个值列表,并将其输入到各个列中。下面是一个简单的例子:

(...)
from pyspark.sql.functions import udf
def udf_test(n):
    return [n/2, n%2]

test_udf=udf(udf_test)


df.select('amount','trans_date').withColumn("test", test_udf("amount")).show(4)

生成以下内容:

+------+----------+--------------------+
|amount|trans_date|                test|
+------+----------+--------------------+
|  28.0|2016-02-07|         [14.0, 0.0]|
| 31.01|2016-02-07|[15.5050001144409...|
| 13.41|2016-02-04|[6.70499992370605...|
| 307.7|2015-02-17|[153.850006103515...|
| 22.09|2016-02-05|[11.0450000762939...|
+------+----------+--------------------+
only showing top 5 rows
df.select('amount','trans_date').withColumn("test", test_udf("amount")).printSchema()

root
 |-- amount: float (nullable = true)
 |-- trans_date: string (nullable = true)
 |-- test: string (nullable = true)

共有1个答案

岳硕
2023-03-14

不可能从单个UDF调用中创建多个顶级列,但可以创建一个新的结构。它需要具有指定returntype的UDF:

from pyspark.sql.functions import udf
from pyspark.sql.types import StructType, StructField, FloatType

schema = StructType([
    StructField("foo", FloatType(), False),
    StructField("bar", FloatType(), False)
])

def udf_test(n):
    return (n / 2, n % 2) if n and n != 0.0 else (float('nan'), float('nan'))

test_udf = udf(udf_test, schema)
df = sc.parallelize([(1, 2.0), (2, 3.0)]).toDF(["x", "y"])

foobars = df.select(test_udf("y").alias("foobar"))
foobars.printSchema()
## root
##  |-- foobar: struct (nullable = true)
##  |    |-- foo: float (nullable = false)
##  |    |-- bar: float (nullable = false)

您可以使用简单的select,进一步扁平化架构:

foobars.select("foobar.foo", "foobar.bar").show()
## +---+---+
## |foo|bar|
## +---+---+
## |1.0|0.0|
## |1.5|1.0|
## +---+---+

另请参见从Spark DataFrame中的单个列派生多个列

 类似资料:
  • 问题内容: 我正在使用pyspark,使用spark- csv将大的csv文件加载到数据帧中,并且作为预处理步骤,我需要对其中一列(包含json字符串)中的可用数据进行多种操作。这将返回X值,每个值都需要存储在自己的单独列中。 该功能将在UDF中实现。但是,我不确定如何从该UDF返回值列表并将其馈送到各个列中。下面是一个简单的示例: 产生以下内容: 将udf返回的两个(在此示例中)值存储在单独的列

  • 问题内容: 我使用此辅助函数来接收我的请求的JSON结果: 我将它作为Web应用程序中url的一部分提供了一些字符串,例如’/ api / getusers’,因此看起来像。现在我需要包含JSON数据,我从URL接收将被分配给我的变量,所以它看起来像这样的字符串结果:。然后,我将处理此JSON数据。问题在于返回响应变量。它是未定义的。谢谢! 问题答案: 这是一个异步操作,这意味着从服务器返回后很长

  • 我有一个如下所示的数据框架 我写了一个UDF来将分类转换为二进制和 我将此应用于数据帧,如下所示 如何将多个列传递到 UDF 中,这样我就不必对其他分类列重复自己?

  • 问题内容: SQL Server(2000/2005)函数获取表名和字段名作为参数,并从函数内的动态查询返回结果。结果应分配给变量,该变量将在存储过程中进一步使用。如何实现呢? 我收到错误消息:“只能从函数中执行函数和扩展存储过程。” 问题答案: 我不确定这如何与函数一起使用,但是如果您有一个存储过程返回一个结果集,则可以使用INSERT EXEC语句将其插入到表变量中。 只要字段匹配,那将起作用

  • 问题内容: 在Python中,我们可以将函数分配给变量。例如,math.sine函数: 有没有简单的方法可以将多个函数(即一个函数的一个函数)分配给一个变量?例如: 问题答案: 我认为作者想要的是某种形式的功能链。通常,这很困难,但是对于 接受一个论点 返回一个值, 列表中上一个函数的返回值与列表中下一个函数的输入类型具有相同的返回值 我们说有一个需要链接的函数列表,其中有一个参数,然后返回一个参

  • 我有一个分区的Hive表。如果我想从这个表中创建一个spark数据帧,那么将创建多少个数据帧分区?