use of io.hetu.core.plugin.datacenter.DataCenterColumnHandle in project hetu-core by openlookeng.
the class DataCenterClient method getTableStatistics.
/**
* Get remote table statistics.
*
* @param tableFullName the fully qualified table name
* @param columnHandles data center column handles
* @return the table statistics
*/
public TableStatistics getTableStatistics(String tableFullName, Map<String, ColumnHandle> columnHandles) {
String query = "SHOW STATS FOR " + tableFullName;
Iterable<List<Object>> data;
try {
data = getResults(clientSession, query);
} catch (SQLException ex) {
throw new PrestoTransportException(REMOTE_TASK_ERROR, HostAddress.fromUri(this.serverUri.uri()), "could not connect to the remote data center");
}
TableStatistics.Builder builder = TableStatistics.builder();
List<Object> lastRow = null;
for (List<Object> row : data) {
ColumnStatistics.Builder columnStatisticBuilder = new ColumnStatistics.Builder();
lastRow = row;
if (row.get(0) == null) {
// Only the last row can have the first column (column name) null
continue;
}
// row[0] is column_name
DataCenterColumnHandle columnHandle = (DataCenterColumnHandle) columnHandles.get(row.get(0).toString());
if (columnHandle == null) {
// Unknown column found
continue;
}
// row[1] is data_size
if (row.get(1) != null) {
columnStatisticBuilder.setDataSize(Estimate.of(Double.parseDouble(row.get(1).toString())));
}
// row[2] is distinct_values_count
if (row.get(2) != null) {
columnStatisticBuilder.setDistinctValuesCount(Estimate.of(Double.parseDouble(row.get(2).toString())));
}
// row[3] is nulls_fraction
if (row.get(3) != null) {
columnStatisticBuilder.setNullsFraction(Estimate.of(Double.parseDouble(row.get(3).toString())));
}
// row[5] is low_value and row[6] is high_value
if (row.get(5) != null && row.get(6) != null) {
String minStr = row.get(5).toString();
String maxStr = row.get(6).toString();
Type columnType = columnHandle.getColumnType();
if (columnType.equals(DATE)) {
LocalDate minDate = LocalDate.parse(minStr, DATE_FORMATTER);
LocalDate maxDate = LocalDate.parse(maxStr, DATE_FORMATTER);
columnStatisticBuilder.setRange(new DoubleRange(minDate.toEpochDay(), maxDate.toEpochDay()));
} else {
columnStatisticBuilder.setRange(new DoubleRange(Double.parseDouble(minStr), Double.parseDouble(maxStr)));
}
}
builder.setColumnStatistics(columnHandle, columnStatisticBuilder.build());
}
// Get row_count from the last row
if (lastRow != null && lastRow.get(4) != null) {
builder.setRowCount(Estimate.of(Double.parseDouble(lastRow.get(4).toString())));
}
return builder.build();
}
Aggregations