hadoop - 如何将参数传递给配置单元 View ,以便 View 根据传递的内容进行更改?

标签 hadoop view hive user-defined-functions

我需要创建一个能够根据配置生成结果的可配置 View 。我的第一种方法是使用配置单元变量并将变量放在 View 中,但这不起作用,因为在创建 View 时,它采用变量的实际值( View 是静态的,无法配置)。第二种方法是调用 UDF 并从中访问变量。我认为这种方法可行,但我不知道如何正确编写它。您能否分享您的想法,也许可以体验如何解决这个问题。

最佳答案

更新

View 的可配置性似乎可以通过 UDF 实现。 我将完整地删除之前的答案。

为了如上所示,我创建了一个简单的 UDF,它输出一个随机 double 值。

package com.example.hive.udf;
public final class MyRandom extends UDF {
    public double evaluate(final double d) {
    Random r = new Random(System.currentTimeMillis());
    return r.nextDouble();
    }
}

然后,使用 hive 注册 jar 以创建我的 udf:

hive> add jar <my-local-path>/myudf.jar;
hive> create temporary function myrand as 'com.example.hive.udf.MyRandom';

假设我已经有一个简单的表sample,当我创建一个 View 时如下:

CREATE OR REPLACE VIEW view as 
select *, myrand(1) from sample;

然后,在 View 上连续 select * 时,我得到了不同的结果。这意味着在涉及 View 的每个语句中,都会发生 UDF 调用。

请记住,UDF 不能使用 ${hiveconf:XXX} 传递参数,因为这将被评估并烘焙到 View 定义中。

因此,实现这种可配置性的方法是在 UDF 类代码中获取配置。这answer提到如何在配置单元 UDF 中访问 JobConfig

我提出了一个相关的Question关于是否可以在 UDF 中访问配置单元变量。如果您有答案(如果仍然没有答案),请考虑提供帮助。

亚历克斯,我认为这是不可能的。

原因同第一种方法行不通。

形成 View 的选择查询将始终在创建 View 时进行评估。因此,即使您已将一些变量传递给在选择查询中用于形成 View 的 UDF,UDF 也会在此时自行评估以具体化 View ,并且 View 内容在那时是固定的。

下次您访问 View 时(没有创建或替换),UDF 将不会被重新调用。

因此,除非您愿意调用与 View 相关的 DML 查询以及一直运行的创建或替换 View ,否则无法实现可配置的 View 。

看这个answer观察 View 如何始终具体化,而不管使用的变量如何。 UDF 的情况也是如此。

关于hadoop - 如何将参数传递给配置单元 View ,以便 View 根据传递的内容进行更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49865429/

相关文章:

date - 如何使用Hadoop生成时间序列?

javascript - 如何在 View MVC 中更改 img src

iphone - Objective - C 如何使用 View Controller iphone 管理多个 View

regex - 为非结构化数据创建配置单元表

hadoop - 在 Pig 的 Parquet 上使用 hive 表

ubuntu - 使用VirtualBox在Ubuntu Server上安装Hadoop

hadoop - Hive 在不知道列数据类型的情况下更改列名

hadoop - 如何在Hadoop中使用Hive/Pig存储银行交易数据

ios - 保存视频后无法导航到另一个 Controller

hadoop - 使用配置单元作为 Metastore 时无法看到数据库