すべてのプロダクト
Search
ドキュメントセンター

Tablestore:Tablestore SDK for Javaを使用してTablestoreデータテーブルにデータを書き込むときに、「属性列の数が最大数を超えています:128」というエラーが報告されるのはなぜですか?

最終更新日:Dec 28, 2024

問題の説明

Tablestore Java SDK を使用して Tablestore データテーブルにデータを書き込むときに、次のエラーが報告されます。

The count of attribute columns exceeds the maximum:128

考えられる原因

Tablestore データテーブルにデータを書き込む場合、1 行あたり最大 1,024 列を書き込むことができます。TableStoreWriter クライアントを使用する場合、クライアントはデフォルトで 1 行あたり最大 128 列を書き込むことができます。

解決策

Tablestore SDK for Javaを使用してTableStoreWriterクライアントを構築する場合、MaxColumnsCountパラメーターを変更して、1行に書き込むことができる列の数を増やすことができます。

説明

Java向けTablestore SDKでは、OTS_AK_ENV環境変数はAlibaba CloudアカウントまたはResource Access Management (RAM)ユーザーのAccessKey IDを示し、OTS_SK_ENV環境変数はAlibaba CloudアカウントまたはRAMユーザーのAccessKeyシークレットを示します。ビジネス要件に基づいてAccessKeyペアを指定します。環境変数の構成方法の詳細については、「初期化」トピックのOTSClientインスタンスの初期化セクションを参照してください。

final String endPoint = ""; 
String accessKeyId = System.getenv("OTS_AK_ENV");
String accessKeySecret = System.getenv("OTS_SK_ENV");
final String instanceName = "";

ClientConfiguration cc = new ClientConfiguration();
cc.setRetryStrategy(new DefaultRetryStrategy()); // 再試行ポリシーをカスタマイズします。データ書き込みの成功率を向上させるために、より積極的な再試行ポリシーを使用できます。
AsyncClient asyncClient = new AsyncClient(endPoint, accessKeyId, accessKeySecret, instanceName, cc);

// クライアントを初期化します。
WriterConfig config = new WriterConfig();
config.setMaxBatchSize(4 * 1024 * 1024); // 一度にインポートできるリクエストの最大サイズを指定します。デフォルト値:4 MB。
config.setMaxColumnsCount(128); // 1行に書き込むことができる列の最大数を指定します。デフォルト値:128。
config.setBufferSize(1024); // メモリにバッファリングできるデータ行の最大数を指定します。デフォルト値:1024。このパラメーターの値は2の指数乗の倍数である必要があります。
config.setMaxBatchRowsCount(100); // 一度にインポートできる行の最大数を指定します。デフォルト値:100。
config.setConcurrency(10); // 同時リクエストの最大数を指定します。デフォルト値: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);