gpt4 book ai didi

apache-spark - 为什么 array_contains 在 SQL 中接受两个参数的列,但在数据集 API 中不接受?

转载 作者:行者123 更新时间:2023-12-04 05:15:59 26 4
gpt4 key购买 nike

我一直在查看有关 array_contains 的问题和答案(和 isin )方法在 StackOverflow 上,我仍然无法回答以下问题:

为什么array_contains在 SQL 中接受列(引用)作为其参数,而标准函数不接受?

我可以理解,上述问题很容易被标记为“主要基于意见”或类似问题,因此让我将其改写为以下内容:

使用方法 array_contains标准函数所以它接受来自列的参数(值)?

scala> spark.version
res0: String = 2.3.0

val codes = Seq(
(Seq(1, 2, 3), 2),
(Seq(1), 1),
(Seq.empty[Int], 1),
(Seq(2, 4, 6), 0)).toDF("codes", "cd")
scala> codes.show
+---------+---+
| codes| cd|
+---------+---+
|[1, 2, 3]| 2|
| [1]| 1|
| []| 1|
|[2, 4, 6]| 0|
+---------+---+

// array_contains in SQL mode works with arguments being columns
val q = codes.where("array_contains(codes, cd)")
scala> q.show
+---------+---+
| codes| cd|
+---------+---+
|[1, 2, 3]| 2|
| [1]| 1|
+---------+---+

// array_contains standard function with Columns does NOT work. Why?!
// How to change it so it would work (without reverting to SQL expr)?
scala> val q = codes.where(array_contains($"codes", $"cd"))
java.lang.RuntimeException: Unsupported literal type class org.apache.spark.sql.ColumnName cd
at org.apache.spark.sql.catalyst.expressions.Literal$.apply(literals.scala:77)
at org.apache.spark.sql.functions$.array_contains(functions.scala:2988)
... 49 elided

最佳答案

仅仅是因为没有人足够关心实现 (Column, Column) => Column变体。如果您检查源代码,您会发现设计中没有任何内容,这会阻止您创建一个,因为标准工作流程是隐藏非 Column文字的参数。

它甚至不是特别有特色。还有其他没有包装器的函数需要额外的 Column参数,包括但不限于不同的日期/时间处理函数和数学函数。

关于apache-spark - 为什么 array_contains 在 SQL 中接受两个参数的列,但在数据集 API 中不接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50412939/

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