华为云用户手册

  • Schema演进支持范围 Schema演进支持范围: 支持列(包括嵌套列)相关的增、删、改、位置调整等操作。 不支持对分区列做演进。 不支持对Array类型的嵌套列进行增、删、列操作。 表1 引擎支持矩阵 引擎 DDL操作Schema 变更后的Hudi表写操作支持 变更后的Hudi表读操作支持 变更后Hudi表compaction支持 SparkSQL Y Y Y Y Flink N Y Y Y HetuEngine N N Y N Hive N N Y N 父主题: Hudi Schema演进
  • 回答 使用root用户登录安装客户端的节点。 执行以下命令,切换到客户端安装目录,例如“/opt/client”。 cd /opt/client 执行以下命令配置环境变量。 source bigdata_env 根据集群认证模式,完成Hive客户端登录。 安全模式,则执行以下命令,完成用户认证并登录Hive客户端。 kinit 组件业务用户 beeline 普通模式,则执行以下命令,登录Hive客户端。 使用指定组件业务用户登录Hive客户端。 beeline -n 组件业务用户 不指定组件业务用户登录Hive客户端,则会以当前操作系统用户登录。 beeline 执行以下命令关闭客户端日志: set hive.server2.logging.operation.enabled=false; 执行以下命令查看客户端日志是否已关闭,如下图所示即为关闭成功。 set hive.server2.logging.operation.enabled;
  • 回答 由于Spark存在一个机制,为了提高性能会缓存ORC的元数据信息。当通过Hive或其他方式更新了ORC表时,缓存的元数据信息未更新,导致Spark SQL查询不到新插入的数据。 对于存储类型为ORC的Hive分区表,在执行插入数据操作后,如果分区信息未改变,则缓存的元数据信息未更新,导致Spark SQL查询不到新插入的数据。 解决措施: 在使用Spark SQL查询之前,需执行Refresh操作更新元数据信息: REFRESH TABLE table_name; table_name为刷新的表名,该表必须存在,否则会出错。 执行查询语句时,即可获取到最新插入的数据。 使用sqark时,执行以下命令禁用Spark优化: set spark.sql.hive.convertMetastoreOrc=false;
  • 示例 merge into h0 as targetusing (select id, name, price, flag from s) sourceon target.id = source.idwhen matched then update set *when not matched then insert *;merge into h0using (select id, name, price, flag from s) sourceon h0.id = source.idwhen matched and flag != 'delete' then update set id = source.id, name = source.name, price = source.price * 2when matched and flag = 'delete' then deletewhen not matched then insert (id,name,price) values(source.id, source.name, source.price);merge into t0 as targetusing s0 sourceon target.id = source.idwhen matched then update set *when not matched then insert *;
  • 使用示例 --给表t1增加列test01 ALTER TABLE t1 ADD COLUMN test01 String DEFAULT 'defaultvalue';--查询修改后的表t1desc t1┌─name────┬─type─┬─default_type─┬─default_expression ┬─comment─┬─codec_expression─┬─ttl_expression─┐│ id │ UInt8 │ │ │ │ │ │ │ name │ String │ │ │ │ │ │ │ address │ String │ │ │ │ │ ││ test01 │ String │ DEFAULT │ 'defaultvalue' │ │ │ │└───────┴────┴────────┴────────── ┴───── ┴──────────┴─────────┘--修改表t1列name类型为UInt8ALTER TABLE t1 MODIFY COLUMN name UInt8;--查询修改后的表t1desc t1┌─name────┬─type─┬─default_type─┬─default_expression ┬─comment─┬─codec_expression─┬─ttl_expression─┐│ id │ UInt8 │ │ │ │ │ │ │ name │ UInt8 │ │ │ │ │ │ │ address │ String │ │ │ │ │ ││ test01 │ String │ DEFAULT │ 'defaultvalue' │ │ │ │└───────┴────┴────────┴────────── ┴───── ┴──────────┴─────────┘--删除表t1的列test01ALTER TABLE t1 DROP COLUMN test01;--查询修改后的表t1desc t1┌─name────┬─type─┬─default_type─┬─default_expression ┬─comment─┬─codec_expression─┬─ttl_expression─┐│ id │ UInt8 │ │ │ │ │ │ │ name │ UInt8 │ │ │ │ │ │ │ address │ String │ │ │ │ │ │└───────┴────┴────────┴────────── ┴───── ┴──────────┴─────────┘
  • 使用示例 --查看ClickHouse集群信息select * from system.clusters;--显示当前节点设置的宏select * from system.macros;--查看数据库容量selectsum(rows) as "总行数",formatReadableSize(sum(data_uncompressed_bytes)) as "原始大小",formatReadableSize(sum(data_compressed_bytes)) as "压缩大小",round(sum(data_compressed_bytes) / sum(data_uncompressed_bytes) * 100,0) "压缩率"from system.parts;--查询test表容量。where条件根据实际情况添加修改selectsum(rows) as "总行数",formatReadableSize(sum(data_uncompressed_bytes)) as "原始大小",formatReadableSize(sum(data_compressed_bytes)) as "压缩大小",round(sum(data_compressed_bytes) / sum(data_uncompressed_bytes) * 100,0) "压缩率"from system.partswhere table in ('test')and partition like '2020-11-%'group by table;
  • 使用示例 --查询表t1的表结构desc t1;┌─name────┬─type─┬─default_type─┬─default_expression ┬─comment─┬─codec_expression─┬─ttl_expression─┐│ id │ UInt8 │ │ │ │ │ │ │ name │ UInt8 │ │ │ │ │ │ │ address │ String │ │ │ │ │ │└───────┴────┴────────┴────────── ┴───── ┴──────────┴─────────┘
  • 使用示例 --删除表t1drop table t1 SYNC; 在删除复制表时,因为复制表需要在Zookeeper上建立一个路径,存放相关数据。ClickHouse默认的库引擎是原子数据库引擎,删除Atomic数据库中的表后,它不会立即删除,而是会在480秒后删除。在删除表时,加上SYNC字段,即可解决该问题,例如:drop table t1 SYNC; 删除本地表和分布式表,则不会出现该问题,可不带SYNC字段,例如:drop table t1;
  • 基本语法 CREATE DATABASE [IF NOT EXISTS] database_name [ON CLUSTER ClickHouse集群名] ON CLUSTER ClickHouse集群名的语法,使得该DDL语句执行一次即可在集群中所有实例上都执行。集群名信息可以使用以下语句的cluster字段获取: select cluster,shard_num,replica_num,host_name from system.clusters;
  • 单表并发控制配置 参数 描述 默认值 hoodie.write.lock.provider 指定lock provider,不建议使用默认值,使用org.apache.hudi.hive.HiveMetastoreBasedLockProvider org.apache.hudi.client.transaction.lock.ZookeeperBasedLockProvider hoodie.write.lock.hivemetastore.database Hive的database 无 hoodie.write.lock.hivemetastore.table Hive的table name 无 hoodie.write.lock.client.num_retries 重试次数 10 hoodie.write.lock.client.wait_time_ms_between_retry 重试间隔 10000 hoodie.write.lock.conflict.resolution.strategy lock provider类,必须是ConflictResolutionStrategy的子类 org.apache.hudi.client.transaction.SimpleConcurrentFileWritesConflictResolutionStrategy hoodie.write.lock.zookeeper.base_path 存放ZNodes的路径,同一张表的并发写入需配置一致 无 hoodie.write.lock.zookeeper.lock_key ZNode的名称,建议与Hudi表名相同 无 hoodie.write.lock.zookeeper.connection_timeout_ms zk连接超时时间 15000 hoodie.write.lock.zookeeper.port zk端口号 无 hoodie.write.lock.zookeeper.url zk的url 无 hoodie.write.lock.zookeeper.session_timeout_ms zk的session过期时间 60000 hoodie.support.write.lock 是否开启并发写检测,开启后执行写和Compaction操作时先获取锁,如果获取锁失败则任务直接退出。 说明: MRS 3.2.0及之后版本支持才支持该功能。 true 父主题: 配置参考
  • 约束 HetuEngine支持对接ClickHouse操作的SQL语法:SHOW CATALOGS/SCHEMAS/TABLES/COLUMNS、DESCRIBE、USE、SELECT 表/视图。 HetuEngine支持对接ClickHouse操作的表和视图: 名称 支持对接ClickHouse操作的表、视图 HetuEngine支持对ClickHouse操作的表 本地表(MergeTree) 复制表(ReplicatedReplacingMergeTree) 分布式表(Distributed) HetuEngine支持对ClickHouse操作的视图 普通视图(Normal) 物化视图(Materialized)
  • 操作步骤 登录客户端。 以客户端安装用户登录安装客户端的节点,执行以下命令切换到客户端安装目录,例如客户端安装目录为“/opt/client”。 cd /opt/client 执行以下命令配置环境变量。 source bigdata_env 如果当前集群已启用Kerberos认证,执行以下命令认证当前用户,当前用户需要具有创建IoTDB表的权限,可参考IoTDB权限管理。如果当前集群未启用Kerberos认证,则无需执行此命令。 kinit MRS集群用户 例如: kinit iotdbuser 执行以下命令,切换IoTDB客户端运行脚本所在目录。 cd /opt/client/IoTDB/iotdb/sbin 集群未启用Kerberos认证(普通模式)需先调用“alter-cli-password.sh”脚本修改默认用户root的默认密码: sh alter-cli-password.sh IoTDBServer实例节点IP RPC端口 IoTDBServer RPC端口可在参数“IOTDB_SERVER_RPC_PORT”中自行配置。默认端口如下: 开源端口默认值为:6667 定制端口默认值为:22260 端口定制/开源区分:创建LTS版本类型集群时,可以选择“组件端口”为“开源”或是“定制”,选择“开源”使用开源端口,选择“定制”使用定制端口。 root用户初始密码为“root”。 执行以下命令登录客户端。 ./start-cli.sh -h IoTDBServer实例节点ip -p IoTDBServer RPC端口 IoTDBServer RPC端口可在参数“IOTDB_SERVER_RPC_PORT”中自行配置。 运行该命令后,根据实际需求指定业务用户名(集群未启用Kerberos认证(普通模式)使用root用户登录): 指定业务用户名,则输入“yes”,并根据提示输入业务用户名和对应的业务用户密码: 不指定业务用户名,则输入“no”;此时,则使用1.c中的用户执行后续操作: 输入其它,则退出登录: 根据图1创建存储组“root.company”。 set storage group to root.company; 创建对应的时间序列,用于表示生产线下对应设备的传感器。 create timeseries root.company.line1.device1.spin WITH DATATYPE=FLOAT, ENCODING=RLE; create timeseries root.company.line1.device1.status WITH DATATYPE=BOOLEAN, ENCODING=PLAIN; create timeseries root.company.line1.device2.temperature WITH DATATYPE=FLOAT, ENCODING=RLE; create timeseries root.company.line1.device2.power WITH DATATYPE=FLOAT, ENCODING=RLE; create timeseries root.company.line2.device1.temperature WITH DATATYPE=FLOAT, ENCODING=RLE; create timeseries root.company.line2.device1.speed WITH DATATYPE=FLOAT, ENCODING=RLE; create timeseries root.company.line2.device2.speed WITH DATATYPE=FLOAT, ENCODING=RLE; create timeseries root.company.line2.device2.status WITH DATATYPE=BOOLEAN, ENCODING=PLAIN; 向时间序列中加入数据。 insert into root.company.line1.device1(timestamp, spin) values (now(), 6684.0); insert into root.company.line1.device1(timestamp, status) values (now(), false); insert into root.company.line1.device2(timestamp, temperature) values (now(), 66.7); insert into root.company.line1.device2(timestamp, power) values (now(), 996.4); insert into root.company.line2.device1(timestamp, temperature) values (now(), 2684.0); insert into root.company.line2.device1(timestamp, speed) values (now(), 120.23); insert into root.company.line2.device2(timestamp, speed) values (now(), 130.56); insert into root.company.line2.device2(timestamp, status) values (now(), false); 查询1号生产线下所有设备指标。 select * from root.company.line1.**; +-----------------------------+-------------------------------+---------------------------------+--------------------------------------+--------------------------------+| Time|root.company.line1.device1.spin|root.company.line1.device1.status|root.company.line1.device2.temperature|root.company.line1.device2.power|+-----------------------------+-------------------------------+---------------------------------+--------------------------------------+--------------------------------+|2021-06-17T11:29:08.131+08:00| 6684.0| null| null| null||2021-06-17T11:29:08.220+08:00| null| false| null| null||2021-06-17T11:29:08.249+08:00| null| null| 66.7| null||2021-06-17T11:29:08.282+08:00| null| null| null| 996.4|+-----------------------------+-------------------------------+---------------------------------+--------------------------------------+--------------------------------+ 删除2号生产线下所有设备指标。 delete timeseries root.company.line2.**; 查询2号生产线指标数据已无内容。 select * from root.company.line2.**; +----+|Time|+----++----+Empty set.
  • 创建Topic 进入KafkaUI,请参考访问KafkaUI。 单击“Create Topic”进入创建Topic页面。在弹出的页面中参考表1填写信息,单击“Create”,完成Topic创建。 表1 创建Topic信息 参数名称 参数描述 备注 Topic Topic的名称,只能包含英文字母、数字、中划线和下划线,且不能多于249个字符。 例如:kafka_ui Partitions Topic的分区数量,取值范围大于等于1,默认为3。 - Replication Factor Topic的副本因子,取值范围为1~N,N为当前集群Broker个数,默认为2。 - 用户可根据业务需要单击“Advanced Options”配置topic相关高级参数,通常保持默认即可。 安全模式集群下,执行Create Topic操作的用户需属于“kafkaadmin”用户组,否则将会由于鉴权失败导致无法创建。 非安全模式集群下,执行Create Topic操作不作鉴权,即任意用户都可执行Create Topic操作。
  • GeoMesa命令行简介 本节介绍常用的GeoMesa命令。更多的GeoMesa命令,请参见https://www.geomesa.org/documentation/user/accumulo/commandline.html。 安装hbase客户端后,加载环境变量后,可使用geomesa-hbase命令行。 查看classpath 执行“classpath”命令,将会返回当前命令行工具的所有classpath信息。 bin/geomesa-hbase classpath 创建表 执行“create-schema”命令创建表,创建表时至少要指定目录名称与表名称,以及表规格。 bin/geomesa-hbase create-schema -c geomesa -f test -s Who:String,What:java.lang.Long,When:Date,*Where:Point:srid=4326,Why:String 描述表 执行“describe-schema”命令获取表描述信息,描述表信息时必须要指定目录名称与表名称。 bin/geomesa-hbase describe-schema -c geomesa -f test 批量导入数据 执行“ingest”命令批量导入数据,导入时需要指定目录名称,表名称,表规格,以及相应的数据转换器等。 数据(车牌号,车辆颜色,经度,纬度,时间):data.csv,并将数据表放在data文件夹中。 AAA,red,113.918417,22.505892,2017-04-09 18:03:46BBB,white,113.960719,22.556511,2017-04-24 07:38:47CCC,blue,114.088333,22.637222,2017-04-23 15:07:54DDD,yellow,114.195456,22.596103,2017-04-21 21:27:06EEE,black,113.897614,22.551331,2017-04-09 09:34:48 表结构定义:myschema.sft,并将myschema.sft放在geomesa命令行工具的conf文件夹中。 geomesa.sfts.cars = { attributes = [ { name = "carid", type = "String", index = true } { name = "color", type = "String", index = false } { name = "time", type = "Date", index = false } { name = "geom", type = "Point", index = true,srid = 4326,default = true } ]} 转换器定义:myconvertor.convert,并将myconvertor.convert放在geomesa命令行工具的conf文件夹中。 geomesa.converters.cars= { type = "delimited-text", format = "CSV", id-field = "$fid", fields = [ { name = "fid", transform = "concat($1,$5)" } { name = "carid", transform = "$1::string" } { name = "color", transform = "$2::string" } { name = "lon", transform = "$3::double" } { name = "lat", transform = "$4::double" } { name = "geom", transform = "point($lon,$lat)" } { name = "time", transform = "date('YYYY-MM-dd HH:mm:ss',$5)" } ]} 执行命令导入数据: bin/geomesa-hbase ingest -c geomesa -C conf/myconvertor.convert -s conf/myschema.sft data/data.csv 数据导入其他参数具体说明请参见:https://www.geomesa.org/documentation/user/accumulo/examples.html#ingesting-data 解释查询 执行“explain”命令获取指定查询语句执行计划的解释说明,解释语句时必须指定目录名称和表名称,以及给定查询语句。 bin/geomesa-hbase explain -c geomesa -f cars -q "carid = 'BBB'" 统计分析 执行“stats-analyze”命令对数据表进行统计分析,同时还可以进一步执行“stats-bounds”,“stats-count”,“stats-histogram”,“stats-top-k”命令对数据表做更详细的统计。 bin/geomesa-hbase stats-analyze -c geomesa -f cars bin/geomesa-hbase stats-bounds -c geomesa -f cars bin/geomesa-hbase stats-count -c geomesa -f cars bin/geomesa-hbase stats-histogram -c geomesa -f cars bin/geomesa-hbase stats-top-k -c geomesa -f cars 导出feature 执行“export”命令导出feature,导出时必须指定目录名称和表名称,同时还可以根据指定的查询语句进行导出。 bin/geomesa-hbase export -c geomesa -f cars -q "carid = 'BBB'" 删除feature 执行“delete-features”命令删除feature,删除时必须指定目录名称和表名称,同时还可以根据指定的查询语句进行删除。 bin/geomesa-hbase delete-features -c geomesa -f cars -q "carid = 'BBB'" 获取目录中的全部表的名称 执行“get-type-names”命令获取指定目录中的表名称。 bin/geomesa-hbase get-type-names -c geomesa 删除表 执行“remove-schema”命令删除表,删除表示至少要指定表所在的目录与表名称。 bin/geomesa-hbase remove-schema -c geomesa -f test bin/geomesa-hbase remove-schema -c geomesa -f cars 删除目录 执行“delete-catalog”命令删除指定的目录。 bin/geomesa-hbase delete-catalog -c geomesa 父主题: 使用HBase
  • Hive配置类问题 Hive SQL执行报错:java.lang.OutOfMemoryError: Java heap space. 解决方案: 对于MapReduce任务,增大下列参数: set mapreduce.map.memory.mb=8192; set mapreduce.map.java.opts=-Xmx6554M; set mapreduce.reduce.memory.mb=8192; set mapreduce.reduce.java.opts=-Xmx6554M; 对于Tez任务,增大下列参数: set hive.tez.container.size=8192; Hive SQL对列名as为新列名后,使用原列名编译报错:Invalid table alias or column reference 'xxx'. 解决方案:set hive.cbo.enable=true; Hive SQL子查询编译报错:Unsupported SubQuery Expression 'xxx': Only SubQuery expressions that are top level conjuncts are allowed. 解决方案:set hive.cbo.enable=true; Hive SQL子查询编译报错:CalciteSubquerySemanticException [Error 10249]: Unsupported SubQuery Expression Currently SubQuery expressions are only allowed as Where and Having Clause predicates. 解决方案:set hive.cbo.enable=true; Hive SQL编译报错:Error running query: java.lang.AssertionError: Cannot add expression of different type to set. 解决方案:set hive.cbo.enable=false; Hive SQL执行报错:java.lang.NullPointerException at org.apache.hadoop.hive.ql.udf.generic.GenericUDAFComputeStats$GenericUDAFNumericStatsEvaluator.init. 解决方案:set hive.map.aggr=false; Hive SQL设置hive.auto.convert.join = true(默认开启)和hive.optimize.skewjoin=true执行报错:ClassCastException org.apache.hadoop.hive.ql.plan.ConditionalWork cannot be cast to org.apache.hadoop.hive.ql.plan.MapredWork. 解决方案:set hive.optimize.skewjoin=false; Hive SQL设置hive.auto.convert.join=true(默认开启)、hive.optimize.skewjoin=true和hive.exec.parallel=true执行报错:java.io.FileNotFoundException: File does not exist:xxx/reduce.xml. 解决方案: 方法一:切换执行引擎为Tez,详情请参考切换Hive执行引擎为Tez。 方法二:set hive.exec.parallel=false; 方法三:set hive.auto.convert.join=false; Hive on Tez执行Bucket表Join报错:NullPointerException at org.apache.hadoop.hive.ql.exec.CommonMergeJoinOperator.mergeJoinComputeKeys 解决方案:set tez.am.container.reuse.enabled=false; 父主题: Hive常见问题
  • index相关配置 参数 描述 默认值 hoodie.index.class 用户自定义索引的全路径名,索引类必须为HoodieIndex的子类,当指定该配置时,其会优先于hoodie.index.type配置。 "" hoodie.index.type 使用的索引类型,默认为布隆过滤器。可能的选项是[BLOOM | HBASE | GLOBAL_BLOOM | SIMPLE | GLOBAL_SIMPLE | BUCKET | RANGE] 。 布隆过滤器消除了对外部系统的依赖,并存储在Parquet数据文件的页脚中。 注意: BUCKET、RANGE索引仅支持INSERT、UPSERT、DELETE、COMPACT操作。 BLOOM hoodie.index.bloom.num_entries 存储在布隆过滤器中的条目数。 假设maxParquetFileSize为128MB,averageRecordSize为1024B,因此,一个文件中的记录总数约为130K。 默认值(60000)大约是此近似值的一半。 注意: 将此值设置得太低,将产生很多误报,并且索引查找将必须扫描比其所需的更多的文件;如果将其设置得非常高,将线性增加每个数据文件的大小(每50000个条目大约4KB)。 60000 hoodie.index.bloom.fpp 根据条目数允许的错误率。 用于计算应为布隆过滤器分配多少位以及哈希函数的数量。通常将此值设置得很低(默认值:0.000000001),在磁盘空间上进行权衡以降低误报率。 0.000000001 hoodie.bloom.index.parallelism 索引查找的并行度,其中涉及Spark Shuffle。 默认情况下,根据输入的工作负载特征自动计算的。 0 hoodie.bloom.index.prune.by.ranges 为true时,从文件框定信息,可以加快索引查找的速度。 如果键具有单调递增的前缀,例如时间戳,则特别有用。 true hoodie.bloom.index.use.caching 为true时,将通过减少用于计算并行度或受影响分区的IO来缓存输入的RDD以加快索引查找。 true hoodie.bloom.index.use.treebased.filter 为true时,启用基于间隔树的文件过滤优化。与暴力模式相比,此模式可根据键范围加快文件过滤速度。 true hoodie.bloom.index.bucketized.checking 为true时,启用了桶式布隆过滤。这减少了在基于排序的布隆索引查找中看到的偏差。 true hoodie.bloom.index.keys.per.bucket 仅在启用bloomIndexBucketizedChecking并且索引类型为bloom的情况下适用。 此配置控制“存储桶”的大小,该大小可跟踪对单个文件进行的记录键检查的次数,并且是分配给执行布隆过滤器查找的每个分区的工作单位。 较高的值将分摊将布隆过滤器读取到内存的固定成本。 10000000 hoodie.bloom.index.update.partition.path 仅在索引类型为GLOBAL_BLOOM时适用。 为true时,当对一个已有记录执行包含分区路径的更新操作时,将会导致把新记录插入到新分区,而把原有记录从旧分区里删除。为false时,只对旧分区的原有记录进行更新。 true hoodie.index.hbase.zkquorum 仅在索引类型为HBASE时适用,必填选项。要连接的HBase ZK Quorum URL。 无 hoodie.index.hbase.zkport 仅在索引类型为HBASE时适用,必填选项。要连接的HBase ZK Quorum端口。 无 hoodie.index.hbase.zknode.path 仅在索引类型为HBASE时适用,必填选项。这是根znode,它将包含HBase创建及使用的所有znode。 无 hoodie.index.hbase.table 仅在索引类型为HBASE时适用,必填选项。HBase表名称,用作索引。Hudi将row_key和[partition_path, fileID, commitTime]映射存储在表中。 无 hoodie.bucket.index.num.buckets 仅在索引类型为BUCKET时适用。Hudi表中每个分区划分桶的个数,每个分区内的数据通过Hash方式放入每个桶内。 注意: 建表或第一次写入数据时设置后不能修改,否则更新数据会存在异常。 MRS 3.2.0及之后版本支持才支持该功能。 256 hoodie.bucket.index.hash.field 仅在索引类型为BUCKET时适用。进行分桶时计算Hash值的字段,必须为主键的子集,默认为Hudi表的主键。 说明: MRS 3.2.0及之后版本支持才支持该功能。 无 hoodie.range.index.range 仅在索引类型为RANGE时适用。每个数据文件中存储的记录范围,只适用于主键为自增主键的场景。如设置为100000,则主键为0-99999记录存储到一个数据文件,以此类推后面每100000条记录存储一个数据文件。 注意: 建表或第一次写入数据时设置后不能修改,否则更新数据会存在异常。 100000 hoodie.check.index.parameter 是否对数据写入设置的索引参数进行校验。 注意: 不同索引间通常是不兼容的,设置为false,可能会导致数据异常。 MRS 3.2.0及之后版本支持才支持该功能。 true 父主题: 配置参考
  • compaction&cleaning配置 参数 描述 默认值 hoodie.clean.automatic 是否执行自动clean。 true hoodie.cleaner.policy 要使用的清理政策。Hudi将删除旧版本的parquet文件以回收空间。 任何引用此版本文件的查询和计算都将失败。需要确保数据保留的时间超过最大查询执行时间。 KEEP_LATEST_COMMITS hoodie.cleaner.commits.retained 保留的提交数。因此,数据将保留为num_of_commits * time_between_commits(计划的),这也直接转化为逐步提取此数据集的数量。 10 hoodie.keep.max.commits 触发归档操作的commit数阈值 说明: Hudi 0.11版本添加了compaction保护,为了让compaction永远有足够的commit去触发,0.11版本要求commit次数超过hoodie.compact.inline.max.delta.commits的阈值才会触发归档,否则就算设置了hoodie.keep.max.commits和hoodie.keep.min.commits也不会触发归档。 30 hoodie.keep.min.commits, 归档操作保留的commit数 20 hoodie.commits.archival.batch 这控制着批量读取并一起归档的提交即时的数量。 10 hoodie.parquet.small.file.limit 该值应小于maxFileSize,如果将其设置为0,会关闭此功能。由于批处理中分区中插入记录的数量众多,总会出现小文件。Hudi提供了一个选项,可以通过将对该分区中的插入作为对现有小文件的更新来解决小文件的问题。此处的大小是被视为“小文件大小”的最小文件大小。 104857600 byte hoodie.copyonwrite.insert.split.size 插入写入并行度。为单个分区的总共插入次数。写出100MB的文件,至少1KB大小的记录,意味着每个文件有100K记录。默认值是超额配置为500K。 为了改善插入延迟,请对其进行调整以匹配单个文件中的记录数。将此值设置为较小的值将导致文件变小(尤其是当compactionSmallFileSize为0时)。 500000 hoodie.copyonwrite.insert.auto.split Hudi是否应该基于最后24个提交的元数据动态计算insertSplitSize,默认关闭。 true hoodie.copyonwrite.record.size.estimate 平均记录大小。如果指定,Hudi将使用它,并且不会基于最后24个提交的元数据动态地计算。 没有默认值设置。这对于计算插入并行度以及将插入打包到小文件中至关重要。 1024 hoodie.compact.inline 当设置为true时,紧接在插入或插入更新或批量插入的提交或增量提交操作之后由摄取本身触发压缩。 true hoodie.compact.inline.max.delta.commits 触发内联压缩之前要保留的最大增量提交数。 5 hoodie.compaction.lazy.block.read 当CompactedLogScanner合并所有日志文件时,此配置有助于选择是否应延迟读取日志块。选择true以使用I/O密集型延迟块读取(低内存使用),或者为false来使用内存密集型立即块读取(高内存使用)。 true hoodie.compaction.reverse.log.read HoodieLogFormatReader会从pos=0到pos=file_length向前读取日志文件。如果此配置设置为true,则Reader会从pos=file_length到pos=0反向读取日志文件。 false hoodie.cleaner.parallelism 如果清理变慢,请增加此值。 200 hoodie.compaction.strategy 用来决定在每次压缩运行期间选择要压缩的文件组的压缩策略。默认情况下,Hudi选择具有累积最多未合并数据的日志文件。 org.apache.hudi.table.action.compact.strategy. LogFileSizeBasedCompactionStrategy hoodie.compaction.target.io LogFileSizeBasedCompactionStrategy的压缩运行期间要花费的MB量。当压缩以内联模式运行时,此值有助于限制摄取延迟。 500 * 1024 MB hoodie.compaction.daybased.target.partitions 由org.apache.hudi.io.compact.strategy.DayBasedCompactionStrategy使用,表示在压缩运行期间要压缩的最新分区数。 10 hoodie.compaction.payload.class 这需要与插入/插入更新过程中使用的类相同。就像写入一样,压缩也使用记录有效负载类将日志中的记录彼此合并,再次与基本文件合并,并生成压缩后要写入的最终记录。 org.apache.hudi.common.model.Defaulthoodierecordpayload hoodie.schedule.compact.only.inline 在写入操作时,是否只生成压缩计划。在hoodie.compact.inline=true时有效。 false hoodie.run.compact.only.inline 通过Sql执行run compaction命令时,是否只执行压缩操作,压缩计划不存在时直接退出。 false 父主题: 配置参考
  • 存储配置 参数 描述 默认值 hoodie.parquet.max.file.size Hudi写阶段生成的parquet文件的目标大小。对于DFS,这需要与基础文件系统块大小保持一致,以实现最佳性能。 120 * 1024 * 1024 byte hoodie.parquet.block.size parquet页面大小,页面是parquet文件中的读取单位,在一个块内,页面被分别压缩。 120 * 1024 * 1024 byte hoodie.parquet.compression.ratio 当Hudi尝试调整新parquet文件的大小时,预期对parquet数据进行压缩的比例。 如果bulk_insert生成的文件小于预期大小,请增加此值。 0.1 hoodie.parquet.compression.codec parquet压缩编解码方式名称,默认值为gzip。可能的选项是[gzip | snappy | uncompressed | lzo] snappy hoodie.logfile.max.size LogFile的最大值。这是在将日志文件移到下一个版本之前允许的最大值。 1GB hoodie.logfile.data.block.max.size LogFile数据块的最大值。这是允许将单个数据块附加到日志文件的最大值。 这有助于确保附加到日志文件的数据被分解为可调整大小的块,以防止发生OOM错误。此大小应大于JVM内存。 256MB hoodie.logfile.to.parquet.compression.ratio 随着记录从日志文件移动到parquet,预期会进行额外压缩的比例。 用于merge_on_read存储,以将插入内容发送到日志文件中并控制压缩parquet文件的大小。 0.35 父主题: 配置参考
  • 同步hive表配置 参数 描述 默认值 hoodie.datasource.hive_sync.enable 是否同步hudi表信息到hive metastore。 注意: 建议该值设置为true,统一使用hive管理hudi表。 false hoodie.datasource.hive_sync.database 要同步给hive的数据库名。 default hoodie.datasource.hive_sync.table 要同步给hive的表名,建议这个值和hoodie.datasource.write.table.name保证一致。 unknown hoodie.datasource.hive_sync.username 同步hive时,指定的用户名。 hive hoodie.datasource.hive_sync.password 同步hive时,指定的密码。 hive hoodie.datasource.hive_sync.jdbcurl 连接hive jdbc指定的连接。 "" hoodie.datasource.hive_sync.use_jdbc 是否使用hive jdbc方式连接hive同步hudi表信息。建议该值设置为false,设置为false后 jdbc连接相关配置无效。 true hoodie.datasource.hive_sync.partition_fields 用于决定hive分区列。 "" hoodie.datasource.hive_sync.partition_extractor_class 用于提取hudi分区列值,将其转换成hive分区列。 org.apache.hudi.hive.SlashEncodedDayPartitionValueExtractor hoodie.datasource.hive_sync.support_timestamp 当hudi表存在timestamp类型字段时,需指定此参数为true,以实现同步timestamp类型到hive元数据中。该值默认为false,默认将timestamp类型同步为bigInt,默认情况可能导致使用sql查询包含timestamp类型字段的hudi表出现错误。 true hoodie.datasource.hive_sync.fast_sync Hudi同步Hive分区方式: true:从最近一次hive同步后所修改的分区直接向Hive表中做add partition if not exist操作。 false:会根据修改的分区去hive表查询是否已存在,不存在的进行添加。 说明: MRS 3.2.0及之后版本支持才支持该功能。 true hoodie.datasource.hive_sync.mode hudi表同步hive表的方式: hms:通过hive meta client同步元数据。 jdbc:通过hive jdbc方式同步元数据。 hiveql:执行hive ql方式同步元数据。 说明: MRS 3.2.0及之后版本支持才支持该功能。 hms 父主题: 配置参考
  • 写入操作配置 表1 写入操作重要配置项 参数 描述 默认值 hoodie.datasource.write.table.name 指定写入的hudi表名。 无 hoodie.datasource.write.operation 写hudi表指定的操作类型,当前支持upsert、delete、insert、bulk_insert等方式。 upsert:更新插入混合操作 delete:删除操作 insert:插入操作 bulk_insert: 用于初始建表导入数据, 注意初始建表禁止使用upsert、insert方式 insert_overwrite:对静态分区执行insert overwrite insert_overwrite_table:动态分区执行insert overwrite,该操作并不会立刻删除全表做overwrite,会逻辑上重写hudi表的元数据,无用数据后续由hudi的clean机制清理。效率比bulk_insert + overwrite 高 upsert hoodie.datasource.write.table.type 指定hudi表类型,一旦这个表类型被指定,后续禁止修改该参数,可选值MERGE_ON_READ。 COPY_ON_WRITE hoodie.datasource.write.precombine.field 该值用于在写之前对具有相同的key的行进行合并去重。 ts hoodie.datasource.write.payload.class 在更新过程中,该类用于提供方法将要更新的记录和更新的记录做合并,该实现可插拔,如要实现自己的合并逻辑,可自行编写。 org.apache.hudi.common.model.DefaultHoodieRecordPayload hoodie.datasource.write.recordkey.field 用于指定hudi的主键,hudi表要求有唯一主键。 uuid hoodie.datasource.write.partitionpath.field 用于指定分区键,该值配合hoodie.datasource.write.keygenerator.class使用可以满足不同的分区场景。 无 hoodie.datasource.write.hive_style_partitioning 用于指定分区方式是否和hive保持一致,建议该值设置为true。 true hoodie.datasource.write.keygenerator.class 配合hoodie.datasource.write.partitionpath.field,hoodie.datasource.write.recordkey.field产生主键和分区方式。 说明: 写入设置KeyGenerator与表保存的参数值不一致时将提示需要保持一致。 org.apache.hudi.keygen.ComplexKeyGenerator 父主题: 配置参考
  • 回答 运行包含Reduce的Mapreduce任务时,通过-Dmapreduce.job.map.output.collector.class=org.apache.hadoop.mapred.nativetask.NativeMapOutputCollectorDelegator命令开启Native Task特性,任务在部分操作系统运行失败,日志中提示错误“version 'GLIBCXX_3.4.20' not found”。该问题原因是操作系统的GLIBCXX版本较低,导致该特性依赖的libnativetask.so.1.0.0库无法加载,进而导致任务失败。 规避手段: 设置配置项mapreduce.job.map.output.collector.class的值为org.apache.hadoop.mapred.MapTask$MapOutputBuffer。
  • 性能优化 元数据缓存 Hudi连接器支持元数据缓存,以便更快地提供对各种操作的元数据请求。可参考调整元数据缓存。 CBO(Cost based Optimizer)优化 定期通过Analyze命令收集表统计信息有助于Hudi连接器CBO优化。 动态过滤 开启动态过滤有助于Hudi连接器的Join算子的计算优化。可参考调整动态过滤。 带分区条件查询 建立分区表并且查询带分区过滤条件有助于过滤部分分区数据,从而提高性能。
  • ClickHouse表数据操作 客户端登录ClickHouse节点。例如: clickhouse client --host node-master3QsRI --multiline --port 9440 --secure; node-master3QsRI 参数为查看ClickHouse服务cluster等环境参数信息中2对应的host_name参数的值。 参考创建本地复制表和分布式表创建表后,可以插入数据到本地表。 例如插入数据到本地表:test insert into test values(toDateTime(now()), rand()); 查询本地表信息。 例如查询2中的表test数据信息: select * from test; SELECT *FROM test┌───────────EventDate─┬─────────id─┐│ 2020-11-05 21:10:42 │ 1596238076 │└──────────────── ┴───────────┘1 rows in set. Elapsed: 0.002 sec. 查询Distributed分布式表。 例如3中因为分布式表test_all基于test创建,所以test_all表也能查询到和test相同的数据。 select * from test_all; SELECT *FROM test_all┌───────────EventDate─┬─────────id─┐│ 2020-11-05 21:10:42 │ 1596238076 │└──────────────── ┴───────────┘1 rows in set. Elapsed: 0.004 sec. 切换登录节点为相同shard_num的shard节点,并且查询当前表信息,能查询到相同的表数据。 例如,退出原有登录节点:exit; 切换到节点node-group-1tXED0003: clickhouse client --host node-group-1tXED0003 --multiline --port 9440 --secure; 通过2可以看到node-group-1tXED0003和node-master3QsRI的shard_num值相同。 show tables; SHOW TABLES┌─name─────┐│ test ││ test_all │└────────┘ 查询本地表数据。例如在节点node-group-1tXED0003查询test表数据。 select * from test; SELECT *FROM test┌───────────EventDate─┬─────────id─┐│ 2020-11-05 21:10:42 │ 1596238076 │└──────────────── ┴───────────┘1 rows in set. Elapsed: 0.005 sec. 切换到不同shard_num的shard节点,并且查询之前创建的表数据信息。 例如退出之前的登录节点node-group-1tXED0003: exit; 切换到node-group-1tXED0001节点。通过2可以看到node-group-1tXED0001和node-master3QsRI的shard_num值不相同。 clickhouse client --host node-group-1tXED0001 --multiline --port 9440 --secure; 查询test本地表数据,因为test是本地表所以在不同分片节点上查询不到数据。 select * from test; SELECT *FROM testOk. 查询test_all分布式表数据,能正常查询到数据信息。 select * from test_all; SELECT *FROM test┌───────────EventDate─┬─────────id─┐│ 2020-11-05 21:12:19 │ 3686805070 │└──────────────── ┴───────────┘1 rows in set. Elapsed: 0.002 sec.
  • 查看ClickHouse服务cluster等环境参数信息 使用ClickHouse客户端连接到ClickHouse服务端,具体请参考从零开始使用ClickHouse。 查询集群标识符cluster等其他环境参数信息。 select cluster,shard_num,replica_num,host_name from system.clusters; SELECT cluster, shard_num, replica_num, host_nameFROM system.clusters┌─cluster───────────┬─shard_num─┬─replica_num─┬─host_name──────── ┐│ default_cluster_1 │ 1 │ 1 │ node-master1dOnG ││ default_cluster_1 │ 1 │ 2 │ node-group-1tXED0001 ││ default_cluster_1 │ 2 │ 1 │ node-master2OXQS ││ default_cluster_1 │ 2 │ 2 │ node-group-1tXED0002 ││ default_cluster_1 │ 3 │ 1 │ node-master3QsRI ││ default_cluster_1 │ 3 │ 2 │ node-group-1tXED0003 │└─────────────── ┴────── ┴─────── ┴──────────────┘6 rows in set. Elapsed: 0.001 sec. 查询分片标识符shard和副本标识符replica。 select * from system.macros; SELECT *FROM system.macros┌─macro───┬─substitution─────┐│ id │ 76 ││ replica │ 2 ││ shard │ 3 │└────── ┴────────────┘3 rows in set. Elapsed: 0.001 sec.
  • 创建本地复制表和分布式表 客户端登录ClickHouse节点,例如:clickhouse client --host node-master3QsRI --multiline --port 9440 --secure; node-master3QsRI 参数为查看ClickHouse服务cluster等环境参数信息中2对应的host_name参数的值。 使用ReplicatedMergeTree引擎创建复制表。 详细的语法说明请参考:https://clickhouse.tech/docs/zh/engines/table-engines/mergetree-family/replication/#creating-replicated-tables。 例如,如下在default_cluster_1集群节点上和default数据库下创建表名为test的ReplicatedMergeTree表: CREATE TABLE default.test ON CLUSTER default_cluster_1 ( `EventDate` DateTime, `id` UInt64 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/test', '{replica}') PARTITION BY toYYYYMM(EventDate) ORDER BY id; 参数说明如下: ON CLUSTER语法表示分布式DDL,即执行一次就可在集群所有实例上创建同样的本地表。 default_cluster_1为查看ClickHouse服务cluster等环境参数信息中2查询到的cluster集群标识符。 ReplicatedMergeTree引擎族接收两个参数: ZooKeeper中该表相关数据的存储路径。 该路径必须在/clickhouse目录下,否则后续可能因为ZooKeeper配额不够导致数据插入失败。 为了避免不同表在ZooKeeper上数据冲突,目录格式必须按照如下规范填写: /clickhouse/tables/{shard}/default/test,其中/clickhouse/tables/{shard}为固定值,default为数据库名,test为创建的表名。 副本名称,一般用{replica}即可。 CREATE TABLE default.test ON CLUSTER default_cluster_1( `EventDate` DateTime, `id` UInt64)ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/test', '{replica}')PARTITION BY toYYYYMM(EventDate)ORDER BY id┌─host─────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐│ node-group-1tXED0002 │ 9000 │ 0 │ │ 5 │ 3 ││ node-group-1tXED0003 │ 9000 │ 0 │ │ 4 │ 3 ││ node-master1dOnG │ 9000 │ 0 │ │ 3 │ 3 │└────────────────────┴────┴─────┴──── ┴─────────── ┴──────────┘┌─host─────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐│ node-master3QsRI │ 9000 │ 0 │ │ 2 │ 0 ││ node-group-1tXED0001 │ 9000 │ 0 │ │ 1 │ 0 ││ node-master2OXQS │ 9000 │ 0 │ │ 0 │ 0 │└────────────────────┴────┴─────┴──── ┴─────────── ┴──────────┘6 rows in set. Elapsed: 0.189 sec. 使用Distributed引擎创建分布式表。 例如,以下将在default_cluster_1集群节点上和default数据库下创建名为test_all 的Distributed表: CREATE TABLE default.test_all ON CLUSTER default_cluster_1 ( `EventDate` DateTime, `id` UInt64 ) ENGINE = Distributed(default_cluster_1, default, test, rand()); CREATE TABLE default.test_all ON CLUSTER default_cluster_1( `EventDate` DateTime, `id` UInt64)ENGINE = Distributed(default_cluster_1, default, test, rand())┌─host─────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐│ node-group-1tXED0002 │ 9000 │ 0 │ │ 5 │ 0 ││ node-master3QsRI │ 9000 │ 0 │ │ 4 │ 0 ││ node-group-1tXED0003 │ 9000 │ 0 │ │ 3 │ 0 ││ node-group-1tXED0001 │ 9000 │ 0 │ │ 2 │ 0 ││ node-master1dOnG │ 9000 │ 0 │ │ 1 │ 0 ││ node-master2OXQS │ 9000 │ 0 │ │ 0 │ 0 │└────────────────────┴────┴─────┴──── ┴─────────── ┴──────────┘6 rows in set. Elapsed: 0.115 sec. Distributed引擎需要以下几个参数: default_cluster_1为查看ClickHouse服务cluster等环境参数信息中2查询到的cluster集群标识符。 default本地表所在的数据库名称。 test为本地表名称,该例中为2中创建的表名。 (可选的)分片键(sharding key) 该键与config.xml中配置的分片权重(weight)一同决定写入分布式表时的路由,即数据最终落到哪个物理表上。它可以是表中一列的原始数据(如site_id),也可以是函数调用的结果,如上面的SQL语句采用了随机值rand()。注意该键要尽量保证数据均匀分布,另外一个常用的操作是采用区分度较高的列的哈希值,如intHash64(user_id)。
  • 使用限制 将策略更改为LOCAL_AZ与更改为ONE_AZ相同,因为上传文件写入时无法确定写入期间的客户端位置。 Mover无法确定AZ的状态,因此可能会导致将副本移动到异常的AZ,并依赖NameNode来进一步处理。 Mover依赖于每个AZ的DataNode节点数达到最小要求,如果在一个DataNode节点数很少的AZ执行,可能会导致与预期不同的结果。 Mover只满足AZ级别的策略,并不保证满足基本BPP。 Mover不支持更改复制因子,新旧AZ策略之间的副本计数差异会导致异常结果。
  • Hive SQL Hive SQL支持Hive-3.1.0版本中的所有特性,详情请参见https://cwiki.apache.org/confluence/display/hive/languagemanual。 系统提供的扩展Hive语句如表1所示。 表1 扩展Hive语句 扩展语法 语法说明 语法示例 示例说明 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name (col_name data_type [COMMENT col_comment], ...) [ROW FORMAT row_format] [STORED AS file_format] | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...) ] ...... [TBLPROPERTIES ("groupId"=" group1 ","locatorId"="locator1")] ...; 创建一个hive表,并指定表数据文件分布的locator信息。详细说明请参见使用HDFS Colocation存储Hive表。 CREATE TABLE tab1 (id INT, name STRING) row format delimited fields terminated by '\t' stored as RCFILE TBLPROPERTIES("groupId"=" group1 ","locatorId"="locator1"); 创建表tab1,并指定tab1的表数据分布在locator1节点上。 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name (col_name data_type [COMMENT col_comment], ...) [ROW FORMAT row_format] [STORED AS file_format] | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...) ] ... [TBLPROPERTIES ('column.encode.columns'='col_name1,col_name2'| 'column.encode.indices'='col_id1,col_id2', 'column.encode.classname'='encode_classname')]...; 创建一个hive表,并指定表的加密列和加密算法。详细说明请参见使用Hive列加密功能。 create table encode_test(id INT, name STRING, phone STRING, address STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ('column.encode.indices'='2,3', 'column.encode.classname'='org.apache.hadoop.hive.serde2.SMS4Rewriter') STORED AS TEXTFILE; 创建表encode_test,并指定插入数据时对第2、3列加密,加密算法类为org.apache.hadoop.hive.serde2.SMS4Rewriter。 REMOVE TABLE hbase_tablename [WHERE where_condition]; 删除hive on hbase表中符合条件的数据。详细说明请参见删除Hive on HBase表中的单行记录。 remove table hbase_table1 where id = 1; 删除表中符合条件“id =1”的数据。 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name (col_name data_type [COMMENT col_comment], ...) [ROW FORMAT row_format] STORED AS inputformat 'org.apache.hadoop.hive.contrib.fileformat.SpecifiedDelimiterInputFormat' outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'; 创建hive表,并设定表可以指定自定义行分隔符。详细说明请参见自定义行分隔符。 create table blu(time string, num string, msg string) row format delimited fields terminated by ',' stored as inputformat 'org.apache.hadoop.hive.contrib.fileformat.SpecifiedDelimiterInputFormat' outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'; 创建表blu,指定inputformat为SpecifiedDelimiterInputFormat,以便查询时可以指定表的查询行分隔符。 父主题: 使用Hive
  • 重建物化视图 创建物化视图的时候,基表数据会填充到物化视图中,但是后续增删改基表的数据,这部分数据是不会自动的同步到物化视图中的。因此,在更新数据后,需要手动对视图进行重建。 语法 ALTER MATERIALIZED VIEW [db_name.]materialized_view_name REBUILD; 案例 alter materialized view group_mv rebuild; 当基表数据更新,而物化视图的数据未更新,则默认物化视图的状态为过期。 基于事务表创建的物化视图,可以通过descirbe语句查看物化视图是否过期。其中“Outdated for Rewriting”值为“Yes”,表示过期,值为“No”,表示未过期。
  • Hive物化视图介绍 Hive物化视图是基于Hive内部表的查询结果得到的特殊表,物化视图可以看做一张中间表,存储实际的数据,占用物理空间。物化视图赖以建立的这些表称为物化视图的基表。 物化视图主要用于预先计算并保存表连接或聚合等耗时较多的操作的结果。在执行查询时,可以将原来基于基表查询的查询语句重写成基于物化视图查询,这样就可以避免进行join、group by等耗时的操作,从而快速的得到结果。
  • 查看物化视图 语法 SHOW MATERIALIZED VIEWS [IN database_name] ['identifier_with_wildcards’]; DESCRIBE [EXTENDED | FORMATTED] [db_name.]materialized_view_name; 案例 show materialized views; describe formatted group_mv;
共100000条