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-01
为 1 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中国游戏开发者大会(CGDC)独立游戏专场演讲嘉宾曝光!业内大牛抢鲜看
2017首届世界西商大会将于8月19日-20日在陕西宾馆开幕