web-dev-qa-db-ja.com

Spark SQLグループ化:どの値を取得するかを気にしない場合は、group byに追加するか、first()でラップします。;

Spark SQLのようなクエリがあります

_select count(ts), truncToHour(ts)
from myTable
group by truncToHour(ts).
_

tsがタイムスタンプタイプである場合、truncToHourはタイムスタンプを時間に切り捨てるUDFです。このクエリは機能しません。やってみると

_select count(ts), ts from myTable group by truncToHour(ts)
_

expression 'ts' is neither present in the group by, nor is it an aggregate function. Add to group by or wrap in first() if you don't care which value you get.;を取得しましたが、次の場合はfirst()が定義されていません。

_select count(ts), first(ts) from myTable group by truncToHour(ts)
_

とにかく、サブクエリを使用せずに必要なものを取得するには?また、なぜ「wrap in first()」と表示されているのに、first()が定義されていないのですか?

8
Paul Z Wu

私は解決策を得ました:

SELECT max(truncHour(ts)), COUNT(ts) FROM myTable GROUP BY truncHour(ts)

または

SELECT truncHour(max(ts)), count(ts) FROM myTable GROUP BY truncHour(ts)

より良い解決策はありますか?

3
Paul Z Wu

https://issues.Apache.org/jira/browse/SPARK-921

実際の関数はfirst_valueのようです。

2
Kumar Deepak