2016-11-24 2 views
0

Ich versuche, die Anzahl der Fensterfunktionen im Bienenstock zu unterscheiden und Fehler zu bekommen.HIVE: Count distinct Fensterfunktion wirft Fehler

Die Abfrage wird wie folgt verwendet:

select user, dt, count(distinct dt) over(partition by user) as dates 
FROM table 

Es führt den folgenden Fehler:

FAILED: SemanticException [Error 10025]: Line 1:123 Expression not in GROUP BY key 'user' 

Ich denke, dass ich die Syntax verwenden wie im Bienenstock angegeben language manual

Was genau mache ich falsch?

+0

Sie müssen Gruppenklausel in Ihrer Abfrage hinzufügen, um mit Aggregatfunktion wie count zu arbeiten. – Bhavesh

+0

Ich versuche, zähle klar als eine Fensterfunktion und nicht als eine regelmäßige Funktion. Es hat funktioniert, eine Gruppe zu geben, aber es funktionierte als normale Funktion und ignorierte den 'over (partition by user)' Teil. –

Antwort

1

Zwei Möglichkeiten,

  1. Sie nicht user und dt in Ihrer Abfrage auswählen können, wenn distinct verwenden, entfernen user und dt die Abfrage gut funktionieren wird.

  2. Sie können nicht distinct in diesem Kontext verwenden, wenn Sie distinct in der obigen Abfrage entfernen, wird dies gut funktionieren. Wenn Sie die verschiedenen und seine Zählung nehmen möchten, können Sie für Sub-Abfrage wie unten gehen,

    select dates.distinct dt from (select dt, count(distinct dt) over(partition by user) as dates FROM table)

Lassen Sie mich wissen, ob das hilft.

+0

Diese Vorschläge helfen, aber sie benötigen zusätzliche Unterabfragen oder Verknüpfungen. Ich hatte gehofft, die Daten mit der Window-Funktion zu bekommen, so dass die Abfrage schneller sein könnte. Aber jetzt bin ich mir nicht sicher, ob Bienenstockunterstützungen verschiedene Fensterfunktionen zählen. –

+0

es unterstützt es .. aber Sie können keine andere Spalte damit auswählen. –

+0

Aber wenn ich keine andere Spalte auswählen kann, kann ich einfach die deutliche Anzahl richtig verwenden? Welchen Vorteil bietet das Fenster verschiedene Funktionen bieten –

0

Die folgende Lösung funktioniert wie eine Zählung. Die dichte Rangfunktion gibt einen Rang für distinkte c innerhalb der Partitionen. Die höchste dichte Rangnummer ist die Anzahl der einzelnen Einträge von c. Nein ruhig die beste Leistung durch die Durchführung von zwei Fensterfunktionen, aber für mich war es die einzige Möglichkeit, es auf Hive < 2.1.0 zu arbeiten.

select src.a, src.b, src.c, max(src.cnt_dens_rank) over (PARTITION BY src.a, src.b) as cnt_distinct 
from 
(
select a, b, c, DENSE_RANK () OVER (PARTITION BY a, b order by c) cnt_dens_rank 
) src