- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Java UDFs return a scalar result. Java UDTFs are not currently supported.
reference
也就是说,我创建了一个 Java UDF,如下所示
CREATE OR replace function MAP_COUNT(colValue String)
returns OBJECT
language java
handler='Frequency.calculate'
target_path='@~/Frequency.jar'
as
$$
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
class Frequency {
Map<String, Integer> frequencies = new HashMap<>();
public Map<String, Integer> calculate(String colValue) {
frequencies.putIfAbsent(colValue, 0);
frequencies.computeIfPresent(colValue, (key, value) -> value + 1);
return frequencies;
}
}
$$;
使用
MAP_COUNT
查询中的 UDF 如下
with temp_1 as
(
SELECT 'John' AS my_col, 27 as age
UNION ALL
SELECT 'John' AS my_col, 28 as age
UNION ALL
SELECT 'doe' AS my_col, 27 as age
UNION ALL
SELECT 'doe' AS my_col, 28 as age
)
select MAP_COUNT(a.my_col) from temp_1 a;
我得到如下结果
|MAP_COUNT(A.MY_COL) |
|-------------------------------|
|{ "John": "1" } |
|{ "John": "2" } |
|{ "John": "2", "doe": "1" } |
|{ "John": "2", "doe": "2"} |
我期望从我的 UDF 得到的结果如下
|MAP_COUNT(A.MY_COL) |
|-------------------------------|
|{ "John": "2", "doe": "2"} |
在雪花中可能吗?
with temp_1 as
(
SELECT 'John' AS my_col, 27 as age
UNION ALL
SELECT 'John' AS my_col, 28 as age
UNION ALL
SELECT 'doe' AS my_col, 27 as age
UNION ALL
SELECT 'doe' AS my_col, 28 as age
)
select MAP_COUNT(a.my_col) as names, MAP_COUNT(a.age) as ages from temp_1 a;
我期望从我的 UDF 得到的结果如下
|names ||AGES |
|-------------------------------||-------------------------------|
|{ "John": "2", "doe": "2"} ||{ "27": "2", "28": "2"} |
有一些方法可以通过简单地重组查询来实现这一点,但我想知道是否可以使用
MAP_COUNT
来做到这一点。功能类似于
OBJECT_AGG
select 子句中的函数。
最佳答案
当您运行使用 UDF 的查询时,并非所有行都一定会转到 UDF 的同一实例。例如,假设您正在从表中进行选择,并且您执行以下操作:
SELECT MyUdf(x) FROM T
这里
T
可能有多个
micro-partitions ,它的执行方式实际上类似于:
SELECT MyUdf(x) FROM T_part1 UNION ALL
SELECT MyUdf(x) FROM T_part2 UNION ALL
SELECT MyUdf(x) FROM T_part3 UNION ALL
SELECT MyUdf(x) FROM T_part4
这里有四个单独的
MyUdf
实例。 ,并且每个人只看到来自
T
的行的一个子集作为一个整体。
CREATE OR replace function MAP_COUNT(colValue array)
returns OBJECT
language java
handler='Frequency.calculate'
target_path='@~/Frequency.jar'
as
$$
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
class Frequency {
public Map<String, Integer> calculate(String[] colValues) {
Map<String, Integer> frequencies = new HashMap<>();
for (String colValue : colValues) {
frequencies.putIfAbsent(colValue, 0);
frequencies.computeIfPresent(colValue, (key, value) -> value + 1);
}
return frequencies;
}
}
$$;
(请注意,我将 UDF 和方法签名更改为分别使用
array
和
String[]
。)现在在查询中使用它:
with temp_1 as
(
SELECT 'John' AS my_col, 27 as age
UNION ALL
SELECT 'John' AS my_col, 28 as age
UNION ALL
SELECT 'doe' AS my_col, 27 as age
UNION ALL
SELECT 'doe' AS my_col, 28 as age
)
select
MAP_COUNT(ARRAY_AGG(a.my_col)) as names,
MAP_COUNT(ARRAY_AGG(a.age)) as ages
from temp_1 a;
这给了我:
names ages
{ "John": "2", "doe": "2" } { "27": "2", "28": "2" }
这里仍然存在两个问题,特别是:
ARRAY_AGG
中。 . 关于snowflake-cloud-data-platform - 在雪花中创建 UDAF(不是 UDTF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68544778/
我正在尝试使用 Spark UDAF 将两个现有列汇总到一个新列中。大多数关于 Spark UDAF 的教程都使用索引来获取输入行每一列中的值。像这样: input.getAs[String](1)
我是Scala开发的新手,正在尝试解决以下问题: 我有一个UDAF,它返回复杂对象的数组(是一个字符串和一个字符串数组)。在更新方法中,缓冲区返回的是wrappedArray类型,我不知道如何使用缓冲
我正在尝试在 Spark 中编写一些注重性能的代码,并想知道我是否应该编写 Aggregator或 User-defined Aggregate Function (UDAF) 用于我在 Datafr
对于我的特定要求,我想编写一个 UDAF,它只是收集所有输入行。 输入是一个两列的行,Double Type; “我认为”的中间模式是 ArrayList(如果我错了,请纠正我) 返回的数据类型是Ar
我从我的 mongodb 中获取了一些数据,如下所示: +------+-------+ | view | data | +------+-------+ |
我正在使用 Scala + Spark 2.0 并尝试编写一个 UDAF,该 UDAF 将元组数组作为其内部缓冲区以及返回类型:... def bufferSchema = new StructTyp
我想编写 Spark UDAF,其中列的类型可以是任何定义了 Scala Numeric 的类型。我在 Internet 上搜索过,但只找到了具体类型的示例,例如 DoubleType、LongTyp
我正在根据 UDAF example 实现 UDAF 。更新阶段如下所示: public void update(MutableAggregationBuffer buffer, Row in
我有一个具有第三方不可序列化属性的类,我需要将其发送到使用该类的一种方法的 UDAF。 由于不可序列化属性,我无法添加“实现可序列化”,并且我无法创建子类包装器,因为该属性在其构造函数中需要一个参数.
我正在尝试创建一个 Hive UDAF 来查找最常出现的列(字符串)值(不是单个字符或子字符串,使用精确的列值)。假设以下是我的名为 my_table 的表(破折号用于在视觉上分隔列)。 User_I
我猜 BigQuery 不支持 UDAF,因为我只能找到关于 UDF 的信息。 BigQuery 是否支持 UDAF?如果没有,有没有办法以某种方式在聚合结果上运行 UDF?也许通过使用 ARRAY_
Spark UDAF 要求您实现多种方法,特别是def update(buffer: MutableAggregationBuffer, input: Row): Unit和def merge(buf
我在名为 end_stats_df 的 pyspark 数据框中有以下数据: values start end cat1 cat2 10 1 2
我想知道在什么情况下 Spark 将执行合并作为 UDAF 功能的一部分。 动机: 我在 Spark 项目中的一个窗口上使用了很多 UDAF 函数。我经常想回答这样的问题: 信用卡交易在 30 天内与
有两个选择语句: select max(min(str)) from (select 0 id, 'a' str from dual) group by id having min(str
我想根据日期、var_currecy_code、 fxd_crncy_code。 我们的 hive 表中有所有数据,现在我们需要使用 hive UDAF 根据最大日期和上面提到的更多输入来计算 c
我有以下架构 - root |-- id:string (nullable = false) |-- age: long (nullable = true) |-- cars: struct (
例如,对于调试 pig udfs,这是可行的:http://ben-tech.blogspot.ie/2011/08/how-to-debug-pig-udfs-in-eclipse.html 我有一
我想创建一个 Map 列来计算出现次数。 例如: +---+----+ | b| a| +---+----+ | 1| b| | 2|null| | 1| a| | 1| a
在 Spark 的文档中,聚合器: abstract class Aggregator[-IN, BUF, OUT] extends Serializable A base class for use
我是一名优秀的程序员,十分优秀!