HBase AggregationClient Durchschnitt der spezifischen SäuleJava

Java-Forum
Anonymous
 HBase AggregationClient Durchschnitt der spezifischen Säule

Post by Anonymous »

Schemabeschreibung
Ich habe eine HBase-Tabelle namens measurements, die zwei Spaltenfamilien hat: measurement und instrument. In der Messung-Familie gibt es die Spalten Messung:1, Messung:2 usw. für jede Art von Substanz, die gemessen wird (1 ,2,3 sind Substanz-IDs), während in instrument Die Spalten lauten instrument:status_1, instrument:status_2 usw. und entsprechen der Korrektheit des Instruments für die spezifische Substanz zum Zeitpunkt der Messung . Zeilenschlüssel sind eine Verkettung von Datum, Uhrzeit und ID der Station, an der die Messung durchgeführt wurde, zum Beispiel:

Code: Select all

ROW                                          COLUMN+CELL
2017-01-01 00:00+101                        column=measurement:1, timestamp=2025-01-26T12:46:42.021, value=?pbM\xD2\xF1\xA9\xFC

2017-01-01 00:00+101                        column=instrument:status_1, timestamp=2025-01-26T12:46:42.025, value=0
< /code>
 Abfrage < /h3>
Ich möchte den durchschnittlichen gemessenen Wert der Substanz mit ID 1 über alle Stationen für 2018-12-05 unter Berücksichtigung von ID 1 ermitteln Nur Zeilen, bei denen Instrument: Status_1 Wert 0 hat (um keine fehlerhaften Ergebnisse im Durchschnitt einzugeben). Ich möchte die durchschnittliche Berechnung auf der Serverseite durchführen, d. H. Nur den resultierenden Wert an meinen Client anstelle von Tausenden von Zeilen geliefert. Also habe ich Folgendes ausprobiert: < /p>
Scan scan = new Scan();
scan.setFilter(new PrefixFilter(Bytes.toBytes("2018-12-05")));
scan.addColumn(Bytes.toBytes("measurement"), Bytes.toBytes("1"));
scan.addColumn(Bytes.toBytes("instrument"), Bytes.toBytes("status_1"));

// include only rows where status_1 is "0"
scan.setFilter(new SingleColumnValueFilter(
Bytes.toBytes("instrument"),
Bytes.toBytes("status_1"),
CompareOperator.EQUAL,
Bytes.toBytes("0")
));

AggregationClient aggregationClient = new AggregationClient(connection.getConfiguration());

// values of measurement column are stored as bytes that are interpreted as double
ColumnInterpreter columnInterpreter = new DoubleColumnInterpreter();

double avg = aggregationClient.avg(TableName.valueOf("measurements"), columnInterpreter, scan);

aggregationClient.close();
AggregationClient löst jedoch eine IOException aus, die besagt, dass beim Aufruf von aggregationClient.avg() nicht mehr als eine Spalte im Scan vorhanden sein darf. Ich benötige den Durchschnitt für die Spalte measurement:1, muss aber auch instrument in den Scan einbeziehen, um Zeilen basierend auf dem Wert von instrument zu filtern: status_1 Spalte. In der Dokumentation für AggregationClient heißt es:

Die Spaltenfamilie darf nicht null sein. Wenn mehrere Familien bereitgestellt werden, wird eine IOException ausgelöst. Es kann auch ein optionaler Spaltenqualifizierer definiert werden.

Gibt es eine Problemumgehung oder eine Möglichkeit, AggregationClient mitzuteilen, welche Spalte im Scan verwendet werden soll? der Durchschnitt für?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post