ClickHouse最重要的表引擎MergeTree家族系列:
MergeTree家族
其他表引擎:
Hdfs表引擎:
create table tableName(xxx type,...)engine =HDFS(url,fomat);
a:创建新的文件
先创建一个文件夹:
hdfs dfs -mkdir /user/hive/warehouse/test.db/hdfsTest/
创建表并插入数据
create table hdfsTest(id Int16,name String)
engine=HDFS('hdfs://node01:8020/user/hive/warehouse/test.db/hdfsTest/a.csv','CSV');
insert into hdfsTest values(1,'zhangsan');
如果上面insert into 报不能打开,权限异常的话,更改文件夹的权限:
hdfs dfs -chmod 777 /user/hive/warehouse/test.db/hdfsTest/
或者
hdfs dfs -chown -R clickhouse:clickhouse /user/hive/warehouse/test.db/hdfsTest/
查看hdfs:
[root@node01 ~]#hdfs dfs -text /user/hive/warehouse/test.db/hdfsTest/a.csv
1,"zhangsan"
b hdfs已有数据
[root@node01 ~]#hdfs dfs -cat /user/hive/warehouse/test.db/one/*
1,zhangsan
2,lisi
create table hdfsTest1(id Int16,name String)
engine = HDFS('hdfs://node01:8020/user/hive/warehouse/test.db/one/*','CSV');
select * from hdfsTest1;
┌─id─┬─name─────┐
│ 1 │ zhangsan │
│ 2 │ lisi │
└────┴──────────┘
但是执行插入会报错:
insert into hdfsTest1 values(3,'zhaoliu') ;
Code: 76. DB::Exception: Received from localhost:9000.
DB::Exception: URI 'hdfs://node01:8020/user/hive/warehouse/test.db/one/*'
contains globs, so the table is in readonly mode.
总结:ab两种方式的区别在于,url指向的路径中是否包含有内容,如果没有内容,那么可读可写,如果有内容,则只读.
(url,format)中的format常见的有CSV
(逗号分隔)TSV
(tab分隔),JSON
等
如果使用的一行的json格式{"id":1,"name":"zhangsan","age":11}
请使用JSONEachRow
详细的format参见format格式
url的路径匹配模式:
*:匹配任意字符 /user/hdfsTest/a*读取所有a开头的文件
?:匹配单个字符 /user/hdfsTest/a?.txt 读取比如aa.txt,ab.txt…
{a,b,c}:匹配其中任一 /user/hdfsTest/{a,b,c}.txt 匹配a.txt b.txt和c.txt
{x…x}: 匹配数字区间 /user/hdfsTest/{1…5}.txt 匹配1.txt 2.txt … 5.txt
另外读取hdfs数据还有一种表函数:hdfs(url,format,structure)
比如上方
create table hdfsTest1(id Int16,name String)
engine = HDFS('hdfs://node01:8020/user/hive/warehouse/test.db/one/*','CSV');
``
可以使用下面的替代
```sql
create table hdfsTest3 engine = MergeTree order by id
as select * from
hdfs('hdfs://node01:8020/user/hive/warehouse/test.db/one/*','CSV','id Int8,name String') ;