如何使用标准查询或使用 UDF 标记一行并将其特定值存储在 Hive 中?

Posted

技术标签:

【中文标题】如何使用标准查询或使用 UDF 标记一行并将其特定值存储在 Hive 中?【英文标题】:how do I mark one row and store its particular value in Hive using standard Query or using UDF? 【发布时间】:2015-05-29 13:03:44 【问题描述】:

我需要在 Hive 中编写一个查询或定义一个需要执行以下操作的函数:

数据集:

Student || Time    || ComuputerPool
-------------------------------------
  A     ||  9:15AM ||  Pool1.Machine2
-------------------------------------
  A     ||  9:45AM ||  Pool1.Machine7
-------------------------------------
  A     ||  10:15AM||  Pool1.Machine9
-------------------------------------
  A     ||  11:00AM||  Pool2.Machine2
-------------------------------------
  A     ||  12:05  ||  Pool2.Machine3
-------------------------------------
  A     ||  12:40  ||  Pool3.Machine5
------------------------------------- 
  A     ||  13:10  ||  Pool1.Machine3
-------------------------------------
  A     ||  13:50  ||  Pool1.Machine10
-------------------------------------
  B   ..........................

所以现在查询应该通过计算他第一次在一个池中使用机器的时间和他第一次开始使用另一个池中的机器的时间差来找出特定学生在特定计算机池中花费了多长时间。所以这个例子他花费的时间将是: 上午 11:00 - 上午 9:15 = 1 小时 45 分钟

我的问题是如何在一个存储时间值中标记第一次使用,并在以后找到下一个池数据时使用它。

【问题讨论】:

你的问题似乎是关于 Hive 的,所以我删除了 mysql 标签。 【参考方案1】:

Hive 支持row_number(),因此您可以使用一种技巧来对顺序值进行分组。两个行号之间的差异定义了一个组,然后可以将其用于聚合。结果查询如下所示:

select student, grp, min(time), max(time)
from (select t.*,
             (row_number() over (partition by student order by time) -
              row_number() over (partition by student, computerpool order by time)
             ) as grp
      from dataset t
     ) t
group by student, grp, computerpool;

编辑:

您的问题是关于 pools 而不是 machines。因此,您大概只关心期间之前的部分。 (顺便说一下,您应该将此信息存储在单独的列中)。

select student, substr(computerpool, 1, 6), min(time), max(time)
from (select t.*,
             (row_number() over (partition by student order by time) -
              row_number() over (partition by student, substr(computerpool, 1, 6) order by time)
             ) as grp
      from dataset t
     ) t
group by student, grp, substr(computerpool, 1, 6);

【讨论】:

它按池分组,即使它们在不同的时间,因为一旦他租用池,它就应该认为池是不同的,并将下次访问视为新组 @dhssa 。 . .我认为这就是这个查询的作用。 我运行了它,它将池分组为一组,无论其时间范围如何,并将它们从 1,2,.. 编号。预期:1. 访问 Pool1 的数字 1,2,.. 并再次从 1, 2, ... 再次访问 Pool1 问题已编辑:添加了额外的两行,因此查询不应将第一个 Pool1 和第二个 Pool1 分组,或者不应将它们全部编号在一起,而是单独编号

以上是关于如何使用标准查询或使用 UDF 标记一行并将其特定值存储在 Hive 中?的主要内容,如果未能解决你的问题,请参考以下文章

Spark UDF:如何在每一行上编写一个 UDF 以提取嵌套结构中的特定值?

如何访问 UIScrollView 的特定子视图(UIWebView)并将一行 Java 传递给它

如何迭代数据框中的行以检测不同的单词并将其保存在新列中?

AutoTask API,如何使用用户定义字段(UDF)从Autotask API查询实体

更改 DataFrame 中的列数据类型并将其传递到 UDF - PySpark

清理特定文件后如何将其标记为已修改或任何标签?