数据操作

最近更新时间:2025-12-24 12:03:43

我的收藏

scan

setCaching

功能:限制单次 RPC 服务端返回的行数。默认无限制。较大的值可加快查询速度,较小的值可减少客户端内存消耗。请根据业务需要调整,以平衡查询速度和内存消耗。
方法签名
public Scan setCaching(int caching);
参数
caching:单次 RPC 返回的行数。
示例
Scan scan = new Scan();
scan.setCaching(500); // 每次 RPC 返回最多 500 行

setMaxResultSize

功能:限制单次 RPC 服务端返回数据的最大字节数。默认无限制。使用时请注意,避免一次性返回过多数据导致内存溢出。
方法签名
public Scan setMaxResultSize(long maxResultSize);
参数
maxResultSize:单次 RPC 返回数据的最大字节数。
示例
Scan scan = new Scan();
scan.setMaxResultSize(1024 * 1024); // 每次 RPC 返回最多 1MB 数据

setAllowPartialResults

功能:设置是否允许返回部分行数据。默认 false,即每次至少返回一整行数据。使用时请注意,避免一次性返回过多数据导致内存溢出。
方法签名
public Scan setAllowPartialResults(final boolean allowPartialResults);
参数
allowPartialResults:是否允许返回部分行数据。
示例
Scan scan = new Scan();
scan.setAllowPartialResults(true); // 允许返回部分行数据

withStartRow 和 withStopRow

功能:指定扫描的起始行和结束行,包括是否包含这些行键。
方法签名
public Scan withStartRow(byte[] startRow);
public Scan withStopRow(byte[] stopRow);
参数
startRow:起始行键。
stopRow:结束行键。
示例
Scan scan = new Scan();
byte[] startRow = Bytes.toBytes("row1");
byte[] stopRow = Bytes.toBytes("row5");
scan.withStartRow(startRow);
scan.withStopRow(stopRow);

setLimit

功能:设置扫描的最大结果数,防止一次性返回大量数据导致内存溢出。
方法签名
public Scan setLimit(int limit);
参数
limit:最大结果数。
示例
Scan scan = new Scan();
scan.setLimit(100); // 最多返回 100 行数据

renewLease

功能:延长 ResultScanner 的有效期限。默认有效期为 60 秒,超时后扫描器自动关闭。
方法签名
ResultScanner.renewLease();
示例
ResultScanner scanner = hTable.getScanner(scan);
Thread.sleep(5 * 1000);
scanner.next();
Thread.sleep(20 * 1000);
scanner.renewLease(); // 延长扫描器有效期

get

checkExistenceOnly

功能checkExistenceOnly 用于设置 Get 操作是否只返回数据是否存在的结果(通过 Result 的 getExists() 方法获取),而不是返回完整的结果集。这可以用于快速检查某行或某个单元格是否存在,减少网络传输和内存消耗。
方法签名:
public Get setCheckExistenceOnly(boolean checkExistenceOnly);
参数:
checkExistenceOnly:如果为 true,则 Get 操作只返回是否存在的结果;如果为 false,则返回完整的结果集。
示例:
// 创建 Get 对象
Get get = new Get(Bytes.toBytes("row1"));

// 设置只检查是否存在
get.setCheckExistenceOnly(true);

// 执行 Get 操作
Result result = table.get(get);

// 检查数据是否存在
boolean exists = result.getExists();
System.out.println("数据是否存在: " + exists);

获取整行数据

功能:获取指定行的所有列族和列的数据。
方法签名:
public Result get(Get get);
参数:
get:Get 对象,指定要获取的行键。
示例:
// 获取整行数据
Get get = new Get(Bytes.toBytes("row1"));
Result result = table.get(get);

获取指定列族的所有列

功能:获取指定行中某个列族的所有列的数据。
方法签名:
public Get addFamily(byte[] family);
参数:
family:列族名称。
示例:
Get getFamily = new Get(Bytes.toBytes("row1"));
getFamily.addFamily(Bytes.toBytes("cf1"));
Result familyResult = table.get(getFamily);

获取指定列

功能:获取指定行中某个列的数据。
方法签名:
public Get addColumn(byte[] family, byte[] qualifier);
参数:
family:列族名称。
qualifier:列名。
示例:
Get getColumn = new Get(Bytes.toBytes("row1"));
getColumn.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1"));
Result columnResult = table.get(getColumn);

获取多个列

功能:获取指定行中多个列的数据。
方法签名:
public Get addColumn(byte[] family, byte[] qualifier);
参数:
family:列族名称。
qualifier:列名。
示例:
Get getMultiple = new Get(Bytes.toBytes("row1"));
getMultiple.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1"));
getMultiple.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col2"));
getMultiple.addColumn(Bytes.toBytes("cf2"), Bytes.toBytes("col3"));
Result multipleResult = table.get(getMultiple);

获取指定版本的数据

功能:获取指定列中多个版本的数据。
方法签名:
public Get setMaxVersions(int maxVersions);
参数:
maxVersions:要获取的最大版本数。
示例:
Get getVersion = new Get(Bytes.toBytes("row1"));
getVersion.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1"));
getVersion.setMaxVersions(3); // 获取最多3个版本
Result versionResult = table.get(getVersion);

获取指定时间范围的数据

功能:获取指定列中某个时间范围内的数据。
方法签名:
public Get setTimeRange(long minStamp, long maxStamp);
参数:
minStamp:时间范围的最小时间戳。
maxStamp:时间范围的最大时间戳。
示例:
Get getTimeRange = new Get(Bytes.toBytes("row1"));
getTimeRange.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1"));
getTimeRange.setTimeRange(System.currentTimeMillis() - 3600000, System.currentTimeMillis());
Result timeRangeResult = table.get(getTimeRange);

mutate

Mutate 操作用于对数据进行修改,主要包括以下四种操作:
1. Put:插入或更新数据。
2. Delete:删除数据。
3. Append:追加数据。
4. Increment:递增数据。

Put操作

功能:插入或更新数据。
方法签名:
public Put addColumn(byte[] family, byte[] qualifier, byte[] value);
public Put addColumn(byte[] family, byte[] qualifier, long timestamp, byte[] value);
参数:
family:列族名称。
qualifier:列名。
value:列值。
timestamp(可选):时间戳。
示例:
// 1. 基础 Put 操作
Put put = new Put(Bytes.toBytes("row1"));
put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1"), Bytes.toBytes("value1"));
put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col2"), Bytes.toBytes("value2"));
table.put(put);

// 2. 带时间戳的 Put
Put putWithTimestamp = new Put(Bytes.toBytes("row1"));
long timestamp = System.currentTimeMillis();
putWithTimestamp.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1"), timestamp, Bytes.toBytes("value1"));
table.put(putWithTimestamp);

Delete 操作

功能:删除数据。
方法签名
public Delete addColumn(byte[] family, byte[] qualifier);
public Delete addColumn(byte[] family, byte[] qualifier, long timestamp);
public Delete addColumns(byte[] family, byte[] qualifier);
public Delete addFamily(byte[] family);
参数
family:列族名称。
qualifier:列名。
timestamp(可选):时间戳。
示例
// 1. 删除整行
Delete deleteRow = new Delete(Bytes.toBytes("row1"));
table.delete(deleteRow);

// 2. 删除指定列族
Delete deleteFamily = new Delete(Bytes.toBytes("row1"));
deleteFamily.addFamily(Bytes.toBytes("cf1"));
table.delete(deleteFamily);

// 3. 删除指定列
Delete deleteColumn = new Delete(Bytes.toBytes("row1"));
deleteColumn.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1"));
table.delete(deleteColumn);

// 4. 删除指定版本
Delete deleteVersion = new Delete(Bytes.toBytes("row1"));
deleteVersion.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1"), timestamp);
table.delete(deleteVersion);

// 5. 删除列的所有版本
Delete deleteAllVersions = new Delete(Bytes.toBytes("row1"));
deleteAllVersions.addColumns(Bytes.toBytes("cf1"), Bytes.toBytes("col1"));
table.delete(deleteAllVersions);

Append 操作

功能:在现有数据的基础上追加数据。
方法签名
public Append add(byte[] family, byte[] qualifier, byte[] value);
参数
family:列族名称。
qualifier:列名。
value:要追加的值。
示例
// 1. 基础 Append 操作
Append append = new Append(Bytes.toBytes("row1"));
append.add(Bytes.toBytes("cf1"), Bytes.toBytes("col1"), Bytes.toBytes("_appended"));
Result appendResult = table.append(append);

// 2. 多个列的 Append
Append appendMultiple = new Append(Bytes.toBytes("row1"));
appendMultiple.add(Bytes.toBytes("cf1"), Bytes.toBytes("col1"), Bytes.toBytes("_suffix1"));
appendMultiple.add(Bytes.toBytes("cf1"), Bytes.toBytes("col2"), Bytes.toBytes("_suffix2"));
Result appendMultipleResult = table.append(appendMultiple);

Increment 操作

功能:对数值类型的列进行递增操作。
方法签名
public Increment addColumn(byte[] family, byte[] qualifier, long amount);
参数
family:列族名称。
qualifier:列名。
amount:递增的数值。
示例:
// 1. 基础 Increment 操作
Increment increment = new Increment(Bytes.toBytes("row1"));
increment.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("counter"), 1L);
Result incrementResult = table.increment(increment);

批量操作

批量操作用于批量处理数据,支持对多个行进行 Put、Get、Delete 等操作,或者混合多种操作。批量操作可以减少网络开销,提高数据处理的效率。

批量 Put 操作

功能:批量插入或更新数据。
方法签名:
public void put(List<Put> puts);
参数:
puts:包含多个 Put 对象的列表。
示例
List<Put> puts = new ArrayList<>();
for (int i = 0; i < 100; i++) {
Put put = new Put(Bytes.toBytes("row" + i));
put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1"), Bytes.toBytes("value" + i));
puts.add(put);
}
table.put(puts);


批量 Get 操作

功能:批量获取数据。
方法签名:
public Result[] get(List<Get> gets);
参数:
gets:包含多个 Get 对象的列表。
示例:
List<Get> gets = new ArrayList<>();
for (int i = 0; i < 100; i++) {
Get get = new Get(Bytes.toBytes("row" + i));
gets.add(get);
}
Result[] results = table.get(gets);


批量 Delete 操作

功能:批量删除数据。
方法签名:
public void delete(List<Delete> deletes);
参数:
deletes:包含多个 Delete 对象的列表。
示例:
List<Delete> deletes = new ArrayList<>();
for (int i = 0; i < 100; i++) {
Delete delete = new Delete(Bytes.toBytes("row" + i));
deletes.add(delete);
}
table.delete(deletes);

混合批量操作

功能:支持在一个批量操作中混合 Put、Get、Delete、Increment 等多种操作。
方法签名:
public Object[] batch(List<? extends Row> actions, Object[] results);
参数:
actions:包含多个 Row 对象(如 Put、Get、Delete、Increment)的列表。
results:用于存储操作结果的数组。
示例
List<Row> actions = new ArrayList<>();
actions.add(new Put(Bytes.toBytes("row1")).addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1"), Bytes.toBytes("value1")));
actions.add(new Get(Bytes.toBytes("row2")));
actions.add(new Delete(Bytes.toBytes("row3")));
actions.add(new Increment(Bytes.toBytes("row4")).addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("counter"), 1L));

Object[] results = new Object[actions.size()];
table.batch(actions, results);