1 背景
Phoenix SQL的一些语法与mysql等数据库的语法有所不同,以下是我在使用过程中遇到的一些问题。
2 问题
- 库名、表名、字段名都需要加双引号,否则会被自动转换为大写,造成不可预知的错误。
- 插入使用
upsert
命令,而不是insert
UPSERT INTO TEST VALUES('foo','bar',3);
UPSERT INTO TEST(NAME,ID) VALUES('foo',123);
UPSERT INTO TEST(ID, COUNTER) VALUES(123, 0) ON DUPLICATE KEY UPDATE COUNTER = COUNTER + 1;
UPSERT INTO TEST(ID, MY_COL) VALUES(123, 0) ON DUPLICATE KEY IGNORE;
- 没有
update
命令,可以采用覆盖更新。
主键相同的数据,新插入的数据会自动覆盖原来的数据
UPSERT INTO test.targetTable(col1, col2) SELECT col3, col4 FROM test.sourceTable WHERE col5 < 100
UPSERT INTO foo SELECT * FROM bar;
- 字符串转数字函数
TO_NUMBER
- 字符串拆分函数
regexp_split("col",'\.')
- 新建表,建表的时候需要在最后加上
column_encoded_bytes=0;
否则在映射到hive的时候会出错。例如:
create table "test"."test" (
"uuid" varchar not null primary key,
"shop_id" varchar,
"shop_name" varchar
)column_encoded_bytes=0;
- 已有hbase表的映射查询,直接执行建表语句,确保表名、列族和列名与原始表保持一致即可,如:
create table "test"."test_table"(
"uuid" varchar not null primary key,
"info"."create_time" varchar,
"info"."act_amt" varchar,
"info"."back_order" varchar,
"info"."buyer" varchar,
"info"."category_num" varchar,
"info"."comments" varchar,
"info"."order_create_time" varchar,
"info"."order_owner" varchar)
column_encoded_bytes=0;