我们正在使用Apache Phoenix与我们的HBase安装进行交互。我们选择Phoenix是因为它使我们能够向HBase列添加数据类型,因为它使您可以使用普通的SQL
与底层数据库进行交互。
使用Phoenix,您可以将表列的类型声明为TIMESTAMP
(请参阅this链接)。例如,让我们声明下表:
Create table T1
(
T1_KEY VARCHAR(10) NOT NULL,
TMSTP TIMESTAMP,
CONSTRAINT PK_T1 PRIMARY KEY (T1_KEY)
);
问题是:使用普通旧SQL在这样的表中使用UPSERT
行的正确语法是什么?您可以使用哪种格式将时间戳值传递给TMSTP
列?
好吧,对于UPSERT
在普通旧SQL中的TIMESTAMP
类型列的值,你必须恢复XML standard date format。遵循此格式,时间戳值如下所示:
2002-05-30T09:30:10.5
然后,结果UPSERT
操作到表T1
将
UPSERT INTO T1 (T1_KEY, TMSTP) VALUES ('0123456789', '2002-05-30T09:30:10.5');
请注意,您必须将时间戳值作为格式正确的VARCHAR
传递。
除非您需要纳秒级粒度,否则请坚持使用DATE类型,这样可以提供毫秒级的粒度和更好的性能。
您还可以将时间戳或日期作为表示自纪元以来毫秒的数字传递。这样,您就不必在应用程序中格式化日期字符串。
UPSERT INTO T1 (T1_KEY, TMSP)
select '0123456789', current_date()
from <some table that exists and has rows in in>
limit 1;
正如rbinnun所说,timestamp
的前缀为我工作。
UPSERT INTO T1 (T1_KEY, TMSTP) VALUES ('0123456789', timestamp'2002-05-30T09:30:10.5');