gpt4 book ai didi

apache-spark - 如何使用变换高阶函数?

转载 作者:行者123 更新时间:2023-12-04 07:45:52 25 4
gpt4 key购买 nike

是关于transform高阶函数 ( https://issues.apache.org/jira/browse/SPARK-23908 )。

有没有办法将它用作标准函数(在包 org.apache.spark.sql.functions._ 中)?

我有一个字符串数组,我想对每个字符串应用 URI 规范化。现在我用 UDF 做到了。我只是跳过了 spark 2.4.0,我可以跳过 UDF。

正如我所见,它应该用于 selectExpr喜欢 df.selectExpr("transform(i, x -> x + 1)")但它只能与 selectExpr 一起使用吗? ?

以这种方式使用它是否可以为转换提供自定义函数?有什么方法可以实现它还是我应该求助于使用好的旧 UDF?

最佳答案

Is there anyway to use it as a standard function located in package org.apache.spark.sql.functions._ ?



目前它仅用于 SQL 表达式,但如果您想返回 Column您的用途 expr :
org.apache.spark.sql.functions._

expr("transform(i, x -> x + 1)"): Column

Using it this way is there anyway to provide a custom function for the transformation?



可以使用 Scala UDF*:

spark.udf.register("f", (x: Int) => x + 1)

Seq((1, Seq(1, 2, 3))).toDF("id", "xs")
.withColumn("xsinc", expr("transform(xs, x -> f(x))"))
.show

+---+---------+---------+
| id| xs| xsinc|
+---+---------+---------+
| 1|[1, 2, 3]|[2, 3, 4]|
+---+---------+---------+

尽管它似乎没有提供比 UDF 带来的任何真正好处,但采用 Seq .

* 对 Python UDF 的部分支持似乎已经到位(udf 被识别,类型被正确派生,调用被调度),但从 2.4.0 开始,序列化机制似乎被破坏(所有记录都传递给 UDF如 None ):
from typing import Optional
from pyspark.sql.functions import expr

sc.version

'2.4.0'

def f(x: Optional[int]) -> Optional[int]:
return x + 1 if x is not None else None

spark.udf.register('f', f, "integer")

df = (spark
.createDataFrame([(1, [1, 2, 3])], ("id", "xs"))
.withColumn("xsinc", expr("transform(xs, x -> f(x))")))

df.printSchema()

root
|-- id: long (nullable = true)
|-- xs: array (nullable = true)
| |-- element: long (containsNull = true)
|-- xsinc: array (nullable = true)
| |-- element: integer (containsNull = true)

df.show()

+---+---------+-----+
| id| xs|xsinc|
+---+---------+-----+
| 1|[1, 2, 3]| [,,]|
+---+---------+-----+

当然,这里没有真正的性能提升潜力 - 它发送到 BasePythonRunner所以开销应该与普通 udf 相同.

相关JIRA票 SPARK-27052 - Using PySpark udf in transform yields NULL values

关于apache-spark - 如何使用变换高阶函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53761600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com