多次元データ管理の基本概念
標準的な二次元テーブルは行と列の交差点で値を管理しますが、現実のデータモデルでは三つ以上の次元(例:時間・地域・製品カテゴリ)が必要となるケースが頻繁に発生します。GuavaのTableクラスはネイティブで多次元をサポートしませんが、適切なネスト構造を用いることでこの制限を克服できます。
Tableのネストによる三次元構造
Tableインスタンスを別のTableのセル値として配置することで、擬似的な三次元データ構造を構築します。各レイヤーが新たな次元を表現し、データアクセス時に複数キーを連鎖的に適用します。
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import java.time.LocalDate;
public class MultiDimTableExample {
public static void main(String[] args) {
// 親Table: 年月 -> 地域 -> 製品指標
Table<String, String, Table<String, Double>> timeRegionTable = HashBasedTable.create();
// 子Tableインスタンス生成
Table<String, Double> tokyoMetrics = HashBasedTable.create();
tokyoMetrics.put("デスクトップPC", 12500.0);
tokyoMetrics.put("モニター", 8400.0);
timeRegionTable.put("2024-06", "関東", tokyoMetrics);
// データ取得: 2024年6月の関東地域におけるデスクトップPC売上
Double pcSales = timeRegionTable.get("2024-06", "関東")
.get("デスクトップPC");
System.out.println("売上額: " + pcSales); // 出力: 12500.0
}
}
多次元データの反復処理手法
ネストされたTable構造の全要素にアクセスするには、キーセットを階層的に走査します。rowKeySet()とcolumnKeySet()を組み合わせて各次元を順次処理します。
Table<String, String, Table<String, Integer>> inventoryData = HashBasedTable.create();
// データ投入処理(省略)
for (String month : inventoryData.rowKeySet()) {
for (String warehouse : inventoryData.columnKeySet()) {
Table<String, Integer> productStock = inventoryData.get(month, warehouse);
for (String product : productStock.rowKeySet()) {
Integer quantity = productStock.get(product);
System.out.printf("%s %s 倉庫: %s - 在庫数%d%n",
month, warehouse, product, quantity);
}
}
}
Map連携による高次元拡張
四つ以上の次元が必要な場合、TableとMapを組み合わせて拡張します。最上位にMapを配置し、その値としてTableを格納することで次元数を増加させます。
import java.util.HashMap;
import java.util.Map;
public class FourDimensionalData {
public static void main(String[] args) {
// 四次元構造: 年度 -> 四半期 -> 地域 -> 製品カテゴリ
Map<Integer, Table<String, String, Table<String, Double>>> annualData = new HashMap<>();
Table<String, String, Table<String, Double>> q1Table = HashBasedTable.create();
Table<String, Double> kantoElectronics = HashBasedTable.create();
kantoElectronics.put("テレビ", 3560.0);
q1Table.put("Q1", "関東", kantoElectronics);
annualData.put(2024, q1Table);
// 2024年度Q1関東地域のテレビ売上取得
Double tvSales = annualData.get(2024)
.get("Q1", "関東")
.get("テレビ");
}
}
実装上の考慮事項
ネスト型構造ではデータ取得時にnullチェックが必須です。また、次元が増加するほどメモリ消費量が指数関数的に増大するため、大規模データには不向きです。多次元分析が必要なシステムでは、この手法がデータ集計処理の効率化に寄与します。