問題の説明
Tablestore SDK for Java を使用してデータテーブルにデータを書き込むときに、次のエラーが報告されます。
The count of attribute columns exceeds the maximum:128原因
TableStoreWriter ツールクラスを使用してデータを書き込む場合、デフォルトでは最大 128 の属性列を書き込むことができます。
解決策
Tablestore SDK for Java を使用して TableStoreWriter を初期化する際に、MaxColumnsCount パラメーターを変更して、書き込むことができる属性列の最大数を増やすことができます。パラメーターの最大値は 1024 で、TableStoreWriter を使用して最大 1,024 の属性列を書き込むことができることを指定します。
コードを実行する前に、環境変数を使用して Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペアを設定します。詳細については、「アクセス認証情報を設定する」をご参照ください。
// インスタンス名を指定します。
final String instanceName = "yourInstanceName";
// インスタンスのエンドポイントを指定します。
final String endPoint = "yourEndpoint";
// 環境変数から AccessKey ID と AccessKey シークレットを取得します。
String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
ClientConfiguration cc = new ClientConfiguration();
cc.setRetryStrategy(new DefaultRetryStrategy()); // カスタム再試行ポリシーを指定します。高い成功率を確保するために、より積極的な再試行ポリシーを使用できます。
AsyncClient asyncClient = new AsyncClient(endPoint, accessKeyId, accessKeySecret, instanceName, cc);
// TableStoreWriter を初期化します。
WriterConfig config = new WriterConfig();
config.setMaxBatchSize(4 * 1024 * 1024); // バッチインポートリクエストの最大サイズを指定します。デフォルトでは、バッチインポートリクエストの最大サイズは 4 MB です。
config.setMaxColumnsCount(128); // 行に書き込むことができる列の最大数を指定します。デフォルト値:128。
config.setBufferSize(1024); // メモリにバッファリングできるデータ行の最大数を指定します。デフォルト値:1024。このパラメーターの値は、2 の指数乗の倍数である必要があります。
config.setMaxBatchRowsCount(100); // 同時にインポートできる行の最大数を指定します。デフォルト値:100。
config.setConcurrency(10); // TableStoreWriter がバッファ内のデータを Tablestore に書き込むために使用する並列リクエストの最大数を指定します。デフォルト値:10。
config.setMaxAttrColumnSize(2 * 1024 * 1024); // 属性列の値の最大サイズを指定します。デフォルトでは、属性列の値の最大サイズは 2 MB です。
config.setMaxPKColumnSize(1024); // プライマリキー列の値の最大サイズを指定します。デフォルトでは、プライマリキー列の値の最大サイズは 1 KB です。
config.setFlushInterval(10000); // バッファでフラッシュ操作がトリガーされる間隔を指定します。デフォルト値:10。単位:秒。
// コールバックを設定します。OTSWriter はこのコールバックを使用して、インポートされた行またはインポートに失敗した行を報告します。このコールバックは、インポートされた行の数とインポートに失敗した行の数をカウントします。
AtomicLong succeedCount = new AtomicLong();
AtomicLong failedCount = new AtomicLong();
TableStoreCallback<RowChange, ConsumedCapacity> callback = new SampleCallback(succeedCount, failedCount);
ExecutorService executor = Executors.newFixedThreadPool(2);
TableStoreWriter tablestoreWriter = new DefaultTableStoreWriter(asyncClient, tableName, config, callback, executor);TableStoreWriter の詳細については、「TableStoreWriter を使用してデータを同時に書き込む」をご参照ください。