当前位置: 首页 > 知识库问答 >
问题:

使用Hive查询计算Hadoop中成功记录之间的差异

相弘方
2023-03-14
SELECT * FROM mytable SORT BY customer_id, call_time;
Customer1    timestamp11
Customer1    timestamp12
Customer1    timestamp13
Customer2    timestamp21
Customer3    timestamp31
Customer3    timestamp32
...
Customer1    timestamp12-timestamp11
Customer1    timestamp13-timestamp12
Customer3    timestamp32-timestamp31
...

我试图从sql解决方案中调整解决方案,但我仍然受到配置单元的限制:它只接受from中的子查询,并且joins必须只包含相等项。

谢谢你。

编辑1:

public class DeltaComputerUDF extends UDF {
private String previousCustomerId;
private long previousCallTime;

public String evaluate(String customerId, LongWritable callTime) {
    long callTimeValue = callTime.get();
    String timeDifference = null;

    if (customerId.equals(previousCustomerId)) {
        timeDifference = new Long(callTimeValue - previousCallTime).toString();
    }

    previousCustomerId = customerId;
    previousCallTime = callTimeValue;

    return timeDifference;
}}
 SELECT customer_id, call_time, delta(customer_id, call_time) FROM mytable DISTRIBUTE BY customer_id SORT BY customer_id, call_time;

我可以在使用该函数之前对表数据进行排序,但我对此不满意,因为我希望避免这是一个开销。

第二:在分布式Hadoop配置的情况下,数据在可用的作业跟踪器之间进行分割。所以我相信这个函数会有多个实例,每个映射器有一个,所以在两个映射器之间有相同的客户数据拆分是可能的。在这种情况下,我将失去客户电话,这是不可接受的。

我不知道如何解决这个问题。我知道distribution BY确保所有具有特定值的数据都被发送到相同的reducer(从而确保SORT按预期工作),有人知道映射器是否有类似的东西吗?

流通常不如编码可比较的UDF或InputFormat对象的效率高。序列化和反序列化数据以将其传入和传出管道的效率相对较低。统一调试整个程序也更难。但是,它对于快速原型化和利用不是用Java编写的现有代码非常有用。对于不想编写Java代码的Hive用户来说,这可能是一种非常有效的方法。

因此,很明显,自定义脚本不是效率方面的最佳解决方案。

但是,我应该如何保持我的UDF功能,但确保它在分布式Hadoop配置中按预期工作呢?我在语言手册UDF wiki页面的UDF内部部分找到了这个问题的答案。如果我编写查询:

 SELECT customer_id, call_time, delta(customer_id, call_time) FROM (SELECT customer_id, call_time FROM mytable DISTRIBUTE BY customer_id SORT BY customer_id, call_time) t;

(抱歉没有添加链接,但我没有足够的信誉点,所以不允许我这样做)

共有1个答案

虞俊美
2023-03-14

这是一个老问题,但为了将来的参考,我在这里写了另一个命题:

配置单元窗口函数允许在查询中使用上一个/下一个值。

类似的代码查询可能是:

SELECT customer_id, call_time - LAG(call_time, 1, 0) OVER (PARTITION BY customer_id ORDER BY call_time) FROM mytable;
 类似资料:
  • 我刚开始使用普罗米修斯,我正在尝试理解一些事情。 我有一个Java的web应用程序,它公开了一个叫做“my_counter”的计数器。 下面的查询有什么区别? 如果我在1小时的相同时间间隔内运行这些查询,为什么两个查询返回不同的结果? 我试图实现的是看看计数器在一个可配置的时间段内增加了多少。 多谢了。 附注。我实际上使用Grafana来运行查询并选择时间范围。

  • 问题内容: 请问您在以下方面的帮助吗? 我正在尝试计算结果中从一条记录到下一条记录的变化。如果我向您显示我当前的查询和结果,可能会有所帮助… 查询给我这些结果… 理想情况下,我想要获得的结果将类似于以下内容… 查看“ 2012年1月1日”的行,由于“笔数”已从以前的526增加到531,因此“ TChange”的值为5。“ FChange”将基于“ Funded”字段。我猜想要知道的是,此示例的上一

  • 我计划使用NodeJS api查询大量的数据。使用流api(https://cloud.google.com/nodejs/docs/reference/firestore/0.13.x/Query?#stream)代替常规的查询获取(https://cloud.google.com/nodejs/docs/reference/firestore/0.13.x/Query?#get)有什么好处吗?

  • 问题内容: 我有一个带有StartDate列的表,我想计算两个连续记录之间的时间差。 谢谢。 @ Mark Byers和@ Yahia,我将请求表作为requestId,startdate 我想知道requestid 1和2、2和3、3和4等之间的时差是多少。我知道我需要在表上进行自我连接,但是我在子句上没有得到正确的支持。 问题答案: 要实现您的要求,请尝试以下操作(从OP编辑后进行更新): 如

  • 问题内容: 请任何人告诉我Hive SQL和查询之间的区别 问题答案: Hive支持SORT BY,可对每个reducer的数据进行排序。“ order by”和“ sort by”之间的区别在于,前者保证输出中的总顺序,而后者仅保证精简器中行的排序。如果存在多个减速器,则“排序依据”可能会给出部分排序的最终结果。 注意:关于单个列的单独SORT BY与CLUSTER BY之间的区别可能会造成混淆

  • 问题内容: 我有两个字符串变量,例如StartTime和EndTime。我需要通过用StartTime减去EndTime来计算TotalTime。 StartTime和EndTime的格式如下: TotalTime(小时和分钟格式)。如何在Android中计算? 问题答案: 尝试下面的代码。 //假设时间格式为 (“ hh:mm a”) 格式 输出 -小时数:: 8