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();
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?