gpt4 book ai didi

HBase RowMutations 替换一行的所有列

转载 作者:行者123 更新时间:2023-12-04 14:46:34 26 4
gpt4 key购买 nike

我有一个带有单个列族的 HBase (v0.94.7) 表,并且随着时间的推移向其中添加了列。这些列被命名为它们创建的时间戳,所以除非我查询该行,否则我不知道它有哪些列。

现在给定一行,我想以原子方式删除此列族的所有现有列并添加一组新的列和值。

于是想到用HBase的RowMutations喜欢:

RowMutations mutations = new RowMutations(row);

//delete the column family
Delete delete = new Delete(row);
delete.deleteFamily(cf);

//add new columns
Put put = new Put(row);
put.add(cf, col1, v1);
put.add(cf, col2, v2);

//delete column family and add new columns to same family
mutations.add(delete);
mutations.add(put);

table.mutateRow(mutations);

但是这段代码最终所做的只是删除了列族,并没有添加新列。这种行为是预期的吗?

如果是这样,那么我怎样才能实现我的目标,即用一组新的列以原子方式替换列族的所有列?

这是相同的测试用例:
import junit.framework.Assert;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableExistsException;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import java.util.NavigableMap;

public class TestHBaseRowMutations {
static String tableName = "nnn";
static byte[] cf1 = Bytes.toBytes("cf1");
static byte[] row = Bytes.toBytes("r1");
static HTablePool hTablePool;

@BeforeClass
public static void beforeClass() throws Exception {
Configuration config = HBaseConfiguration.create();
hTablePool = new HTablePool(config, Integer.MAX_VALUE);
HBaseAdmin admin = new HBaseAdmin(config);
HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
tableDescriptor.addFamily(new HColumnDescriptor(cf1));
try {
admin.createTable(tableDescriptor);
} catch (TableExistsException ignored){}
}

@Before
public void before() throws Exception {
HTableInterface table = hTablePool.getTable(tableName);
try {
Delete delete = new Delete(row);
table.delete(delete);
System.out.println("deleted old row");

Put put = new Put(row);
put.add(cf1, Bytes.toBytes("c1"), Bytes.toBytes("v1"));
put.add(cf1, Bytes.toBytes("c11"), Bytes.toBytes("v11"));
table.put(put);
System.out.println("Created row with seed data");
} finally {
table.close();
}
}


@Test
public void testColumnFamilyDeleteRM() throws Exception {
HTableInterface table = hTablePool.getTable(tableName);
try {
RowMutations rm =new RowMutations(row);

//delete column family cf1
Delete delete = new Delete(row);
delete.deleteFamily(cf1);
rm.add(delete);
System.out.println("Added delete of cf1 column family to row mutation");

//add new columns to same column family cf1
Put put = new Put(row);
put.add(cf1, Bytes.toBytes("c1"), Bytes.toBytes("new_v1"));
put.add(cf1, Bytes.toBytes("c11"), Bytes.toBytes("new_v11"));
rm.add(put);
System.out.println("Added puts of cf1 column family to row mutation");

//atomic mutate the row
table.mutateRow(rm);
System.out.println("Mutated row");

//now read the column family cf1 back
Result result = table.get(new Get(row));
NavigableMap<byte[], byte[]> familyMap = result.getFamilyMap(cf1);

//column family cf1 should have 2 columns because of the Put above
//------Following assert fails as cf1 does not exist anymore, why does cf1 not exist anymore?-------
Assert.assertNotNull(familyMap);
Assert.assertEquals(2, familyMap.size());
} finally {
table.close();
}
}
}

最佳答案

在 HBase 用户论坛上发布了相同的问题,结果发现这是 HBase 中的一个错误。

预期的行为是,如果 RowMutation 对某些列族/列/行有一个删除,然后是对同一列族/列/行的 Put,则也应该遵守 Put(但目前情况并非如此)。

HBase 用户组对此的讨论:
http://apache-hbase.679495.n3.nabble.com/Using-RowMutations-to-replace-all-columns-of-a-row-td4045247.html

HBase JIRA 相同:
https://issues.apache.org/jira/browse/HBASE-8626它还提供补丁。

关于HBase RowMutations 替换一行的所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16755336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com