当前位置: 首页 > 知识库问答 >
问题:

带时间戳的HBase Put不起作用

堵存
2023-03-14

我编写了一个简单的测试程序来插入一行。与普通HBase Put示例程序的唯一不同之处在于,Put实例及其KeyValue实例是用时间戳创建的。

预期的行为是插入行。但是,在我的HBase环境中,没有插入行。

下面是我的测试程序。

import java.io.*;
import java.util.*;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.*;

public class Test
{
    // Names of table, family, qualifier and row ID.
    private static final byte[] TABLE     = Bytes.toBytes("test-table");
    private static final byte[] FAMILY    = Bytes.toBytes("test-family");
    private static final byte[] QUALIFIER = Bytes.toBytes("test-qualifier");
    private static final byte[] ROWID     = Bytes.toBytes("test-rowid");

    /**
     * The entry point of this program.
     *
     * <p>
     * This program assumes that there already exists an HBase
     * table named "test-table" with a column family named
     * "test-family". To create an HBase table satisfying these
     * conditions, type the following at the hbase shell prompt.
     * </p>
     *
     * <pre>
     * hbase&gt; create 'test-table', 'test-family'
     * </pre>
     *
     * <p>
     * This program inserts a row whose row ID is "test-rowid"
     * with a column named "test-family:test-qualifier". The
     * value of the column is the string expression of
     * <code>new Date()</code>.
     * </p>
     */
    public static void main(String[] args) throws Exception
    {
        // Get the table.
        Configuration conf = HBaseConfiguration.create();
        HTable table = new HTable(conf, TABLE);

        // Prepare data to put.
        byte[] value = Bytes.toBytes(new Date().toString());
        Put put = new Put(ROWID);
        put.add(FAMILY, QUALIFIER, value);

        // Clone Put with a timestamp.
        put = clone(put, 10);

        // Put the data.
        table.put(put);

        // Read back the data.
        Get get = new Get(ROWID);
        Result result = table.get(get);

        // Dump the read data.
        System.out.println("DATA = " + result.toString());
    }

    /**
     * Clone the given Put instance with the given timestamp.
     */
    private static Put clone(Put a, long timestamp) throws IOException
    {
        // Create a Put instance with the specified timestamp.
        Put b = new Put(a.getRow(), timestamp);

        Map<byte[], List<KeyValue>> kvs = a.getFamilyMap();

        // Copy KeyValue's from the source Put (a) to
        // the cloned Put (b). Note the given timestamp
        // is used for each new KeyValue instance.
        for (List<KeyValue> kvl : kvs.values())
        {
            for (KeyValue kv : kvl)
            {
                b.add(new KeyValue(
                    kv.getRow(),
                    kv.getFamily(),
                    kv.getQualifier(),
                    timestamp,
                    kv.getValue()));
            }
        }

        return b;
    }
}

该程序生成的控制台输出如下所示。

DATA = keyvalues=NONE

而hbase shell中的“scan”表示“0行(s)”。

hbase(main):011:0> scan 'test-table'
ROW                                              COLUMN+CELL
0 row(s) in 0.0080 seconds
        // Clone Put with a timestamp.
        //put = clone(put, 10);
DATA = keyvalues={test-rowid/test-family:test-qualifier/1344594210281/Put/vlen=28}
hbase(main):012:0> scan 'test-table'
ROW                                              COLUMN+CELL
 test-rowid                                      column=test-family:test-qualifier, timestamp=1344594210281, value=Fri Aug 10 19:23:30 JST 2012
1 row(s) in 0.0110 seconds

共有1个答案

唐兴思
2023-03-14

时间戳列族和列名构成组合键。这里的时间戳是UNIX时间戳。

 类似资料:
  • 返回我女巫是错误的。 但接下来的查询如下: 我看对日期

  • 我正在尝试将时间戳值转换为twig文件中的日期格式,但出现以下错误。 错误: 在呈现模板期间引发了异常(“DateTime::\构造():无法分析时间字符串(

  • 我刚刚遇到了一个非常奇怪的问题,当使用带有时间戳和水印赋值器的EventTime时,我无法从流窗口联接中获得任何结果。 我使用Kafka作为我的数据流源,并尝试了AscendingTimestampExtractor和自定义赋值器,它们实现了Flink留档中提到的Assignerwith周期水印,正如我测试的那样,没有发出水印,也没有生成连接结果。如果我更改为使用ProcessingTime和Tu

  • 问题内容: 中欧夏令时开始于三月的最后一个星期日。我们将时钟设置为02:00到03:00。如果我在数据库请求中进行时间戳计算会发生什么?比方说,在01:59? 结果是03:00还是02:00? 如果我们将时钟设置为03:00到02:00,那结束了呢? 时间从03:00更改为02:00之后…在02:00会发生什么?是02:59还是01:59? 应该如何处理?最佳实践以及Oracle Database

  • 我有几个库,我已经手动部署到我的Nexus存储库中,使用: 包装战争时有没有可能消除时间戳?