9 月 1 日在 8 月 31 日之前在 Zeppelin 中按日期排序的条形图,请问如何解决?

Posted

技术标签:

【中文标题】9 月 1 日在 8 月 31 日之前在 Zeppelin 中按日期排序的条形图,请问如何解决?【英文标题】:1st Sept coming before 31st Aug in bar chart ordering by date in Zeppelin, how to fix please? 【发布时间】:2021-10-30 21:53:25 【问题描述】:

在 Zeppelin 中,我有一个简单的值(Y 轴)与日期(X 轴)的条形图,在本月(今天)的新开始之前,它工作正常,当时它把“9 月 1 日”放在“8 月 31 日”之前”。我按日期字符串排序(因为这是我需要在图表上显示的字符串)。

查询:

%impala
SELECT FROM_TIMESTAMP(DATE_TRUNC('HOUR', concat(replace(my_timestamp,'"',''), "Z")), 'd MMM HH:mm') AS hours, COUNT(my_number) AS "number per hour"
FROM my_table
WHERE unix_timestamp(my_timestamp) > (unix_timestamp(now()) - 86400)
GROUP BY 1
ORDER BY 1 ASC
LIMIT 24;

我意识到问题是由于日期字符串的字母数字比较造成的。我想我可以通过为日期的 unix_timestamp() 添加第三列然后按此排序来修复它,但这会产生分组错误:

java.sql.SQLException: [Cloudera][ImpalaJDBCDriver](500051) ERROR processing query/statement. Error Code: 0, SQL state: TStatus(statusCode:ERROR_STATUS, sqlState:HY000, errorMessage:AnalysisException: select list expression not produced by aggregation output (missing from GROUP BY clause?): unix_timestamp(my_timestamp)

对于这个查询:

%impala
SELECT FROM_TIMESTAMP(DATE_TRUNC('HOUR', concat(replace(my_timestamp,'"',''), "Z")), 'd MMM HH:mm') AS hours, COUNT(my_number) AS "number per hour", unix_timestamp(my_timestamp)
FROM my_table
WHERE unix_timestamp(my_timestamp) > (unix_timestamp(now()) - 86400)
GROUP BY 1
ORDER BY 3 ASC
LIMIT 24;

请如何解决以获得正确顺序的图表?

【问题讨论】:

该错误是由于您尝试选择列/计算值,这不是您的 GROUPing 的一部分。但是你不能通过my_timestamp 订购吗? (不确定这是否会产生同样的错误。) @CBroe 好的,谢谢,在这种情况下不知道如何修复组。但是我只是将“order by”行更改为:“ORDER BY my_timestamp ASC”并从 SELECT 子句中删除了“, unix_timestamp(my_timestamp)”,但我仍然遇到相同的分组错误... my_timestamp 添加到您的分组中可能不是一个好主意,它的粒度与您的格式化值不同。但是您可以添加不同的格式,例如 09-011 Sep,然后将其包含在您的分组中 - 因为这两个值是直接相关的,所以根本不应该影响结果。或者您可以将现有查询用作子查询,然后在外部查询中应用排序。 【参考方案1】:

yyyy-MM-dd HH:mm 格式计算附加列(与小时相同的粒度,但采用可排序格式)并将其添加到 groupby(小时前列)和 order by(而不是小时列):

SELECT FROM_TIMESTAMP(DATE_TRUNC('HOUR', concat(replace(my_timestamp,'"',''), "Z")), 'd MMM HH:mm') AS hours, 
       FROM_TIMESTAMP(DATE_TRUNC('HOUR', concat(replace(my_timestamp,'"',''), "Z")), 'yyyy-MM-dd HH:mm') as dt,
       COUNT(my_number) AS "number per hour"
FROM my_table
WHERE unix_timestamp(my_timestamp) --also it seems Z should be removed, etc 
      > (unix_timestamp(now()) - 86400)
GROUP BY dt, hours
ORDER BY dt
LIMIT 24;

【讨论】:

以上是关于9 月 1 日在 8 月 31 日之前在 Zeppelin 中按日期排序的条形图,请问如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

2020年8月31日-9月4日周报

2020中国游戏开发者大会(CGDC)独立游戏专场演讲嘉宾曝光!业内大牛抢鲜看

区块链学姐:8月6日周末交易量急剧下降,仓位上需严格把控

2017首届世界西商大会将于8月19日-20日在陕西宾馆开幕

《首届国际区块链论坛暨“区块链+产业”应用峰会》将于9月9日在2020厦洽会期间盛大开幕

9月10日2020华为开发者大会:聚焦鸿蒙HMSEMUI