带有 Apache Phoenix 的列族

Posted

技术标签:

【中文标题】带有 Apache Phoenix 的列族【英文标题】:Column family with Apache Phoenix 【发布时间】:2016-03-11 05:27:57 【问题描述】:

我已经创建了下表:

CREATE TABLE IF NOT EXISTS "events" (
"product.name" VARCHAR(32),
"event.name" VARCHAR(32),
"event.uuid" VARCHAR(32),
CONSTRAINT pk PRIMARY KEY ("event.uuid")
)

插入事件:

upsert into "events" ("event.uuid", "event.name", "product.name") values('1', 'click', 'api')

从 HBase shell 获取数据:

hbase(main):020:0> scan 'events'
ROW                                                  COLUMN+CELL
 1                                                   column=0:_0, timestamp=1449417795078, value=
 1                                                   column=0:event.name, timestamp=1449417795078, value=click
 1                                                   column=0:product.name, timestamp=1449417795078, value=api
1 row(s) in 0.0200 seconds

没有列族;-(

从 HBase shell,尝试插入数据:

hbase(main):021:0> put 'events', '2', 'event:name','buy'

ERROR: Unknown column family! Valid column names: 0:*

为什么?

【问题讨论】:

【参考方案1】:

双引号标识符使其区分大小写,因此如果您希望列族和列名都区分大小写,则需要将它们分别单独用双引号括起来,如下所示:

CREATE TABLE IF NOT EXISTS "events" (
    "product"."name" VARCHAR(32),
    "event"."name" VARCHAR(32),
    "event"."uuid" VARCHAR(32),
    CONSTRAINT pk PRIMARY KEY ("event"."uuid")
)

然后像这样插入:

UPSERT INTO "events" ("event"."uuid", "event"."name", "product"."name")
    VALUES ('1', 'click', 'api')

除非列名不明确,否则在 UPSERT 语句中不需要使用列族名称来限定列名。如果您不需要匹配现有数据的格式,另一种选择是不使用双引号。否则,例如,请参阅this FAQ。

FWIW,最好的提问地点是我们的开发人员或用户mailing lists。

【讨论】:

天啊!我只读了 phoenix.apache.org/language/index.html#column_ref 。非常感谢。 这对我不起作用并引发此错误:错误:错误 1003 (42J01):主键列不能有姓氏。 columnName=event.uuid 构成主键的列不应以列族为前缀(就像消息中所说的那样)。这将正常工作:创建表如果不存在“事件”(“产品”。“名称”VARCHAR(32),“事件”。“名称”VARCHAR(32),“uuid”VARCHAR(32),CONSTRAINT pk PRIMARY KEY ("uuid"))

以上是关于带有 Apache Phoenix 的列族的主要内容,如果未能解决你的问题,请参考以下文章

phoenixrc5.5报错

gcp bigtable 中的列族是啥,数据如何存储在 bigtable 中?

列族数据库的设计

为什么不建议在 HBase 中使用过多的列族

为什么不建议在 HBase 中使用过多的列族

如何从 google bigtable 中删除特定的列族数据