• [知识分享] 如何利用数仓创建时序表
    >摘要:怎么快速上手,创建适合自己业务的时序表,怎样使用才能真正发挥时序表的优势。 本文分享自华为云社区《[GaussDB(DWS)带你走近IoT时代-时序表建表最佳实践](https://bbs.huaweicloud.com/blogs/359142?utm_source=csdn&utm_medium=bbs-ex&utm_campaign=ei&utm_content=content)》,作者:AndyCao。 # 创建第一张时序表 我们首先来介绍一下如何创建一张时序表 **语法格式** ``` CREATE TABLE [ IF NOT EXISTS ] table_name ({ column_name data_type [ kv_type ] | LIKE source_table [like_option [...] ] } } [, ... ]) [ WITH ( {storage_parameter = value} [, ... ] ) ] [ TABLESPACE tablespace_name ] [ DISTRIBUTE BY HASH ( column_name [,...])] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] [ table_partitioning_clauses ] [ PARTITION BY { {RANGE (partition_key) ( partition_less_than_item [, ... ] )} } [ { ENABLE | DISABLE } ROW MOVEMENT ] ]; ``` 其中like选项like_option为:{ INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | DISTRIBUTION | ALL } 时序表的建表语法,在很大程度上继承了行存和列存的语法,降低了用户的学习成本,能够更容易理解和使用。我们上篇博客中介绍到,将时序表的列分为三种kv_type类型(tag、field、time),那么如何将对应的列指定为合适的类型,帮助我们更好的提高导入、查询等场景的性能,让业务场景运行的更加高效呢? 我们继续以发电机组的场景作为示例,创建一张存储发电机组采样数据的时序表: ``` CREATE TABLE IF NOT EXISTS GENERATOR( dynamo text TSTag, manufacturer text TSTag, model text TSTag, location text TSTag, ID bigint TSTag, voltage numeric TSField, power bigint TSTag, frequency numeric TSField, angle numeric TSField, time timestamptz TSTime) with (orientation=TIMESERIES, period='7 days', ttl='1 month') distribute by hash(model); ``` 我们可以看到,上述建表语句中: - 对于不随时间的变化而变化,描述发电机的属性信息的列(发电机信息、生产厂商、型号、位置、ID)被设置为tag列,在建表时需要将对应的列后面指定为TSTag; - 对于采样数据的维度(电压、功率、频率、电流相角)这些对应的采样数值随时间的变化而变,我们将这些维度设置为field列,建表语句数据类型后面指定为TSField; - 最后一列我们指定为时间列time,存储field列数据对应的时间信息,建表时将指定为TSTime。 在写建表语句时,对于tag列的顺序,我们可以适当优化一下,将唯一性(distinct值)较高的列尽量写在前面,这样对于时序场景的性能有一些提升。如果用户没有手动优化,GaussDB(DWS) IoT数仓也可以自适应的帮助用户提高时序场景的性能,这后面我们会专门文章介绍这一**黑科技**。 另外,创建时序表时一定要指定表级参数orientation属性设置为timeseries。时序表不需要手动指定DISTRIBUTE BY和PARTITION BY, 默认按照所有tag列分布,且分区健默认为tstim指定的时间列。 对于create table like语法,该语法需要自动从源表中继承列名和对应的kv_type类型。因此如果源表是非时序表,新表是时序表,对应的列的kv_type类型无法确定,则无法创建成功。 # 时序表列类型 上面对时序表的三种kv_type属性进行了简单的说明:(维度属性(TSTag),指标属性(TSField),时间属性(TSTime),那么每个列他们支持的类型(类似建表语句中的text、int、numeric等)分别都是什么呢?是否可以不设置kv_type类型? 首先时序表必须指定一个时间属性(TSTime),且只能指定一个,且TSTime类型的列不能被删除。至少存在一个TSTag和TSField列,否则建表报错。 TSTag列支持类型:text, char, bool, int, big int。 TSTime列支持类型:timestamp with time zone, timestamp without time zone。在兼容Oracle语法的数据库中,也支持date类型。涉及到时区相关操作时,请选择带时区的时间类型。 TSField列支持的数据类型同列存表保持一致 # 自动设置分区边界 时序表具备数据生命周期管理的能力。每天数以亿计的数据不间断涌入,对于很久之前的数据,其价值较低不经常访问,可以定期将无用的老数据删除。并且由于最新的数据不断进来,需要定期给表增加新的分区,避免新数据无法存储。因此时序表需要具备定时增加分区和定时删除分区的能力。 时序表以TSTIME列为分区键,创建具有自动分区管理功能的分区表,帮助我们大大减少运维操作的工作。在上面的建表语句中,在表级参数项中可以看到,时序表指定了自动分区管理两个参数period和ttl。 - period:设置自动创建分区的间隔时间,默认值为1 day, 取值范围:1 hour ~ 100 years。默认会为时序表创建自增分区任务。自增分区任务动态为我们创建分区,保证当前时刻有足够充裕的分区用于导入数据。 - ttl:设置自动淘汰分区的时间,取值范围:1 hour ~ 100 years。默认不创建淘汰分区任务,需要用户自己在建表手动指定,或者建表后通过ALTER TABLE语法设置。淘汰分区的策略是通过计算 nowtime - 分区boundary > ttl,满足该条件的分区将被drop掉。帮助用户定时清理过期的旧数据。 上面举得例子中,时序表建表语句没有指定分区,那么分区的起始时间是怎么样的。为了方便用户的使用,我们的分区边界的设置分为了一下几种情况 - period设置为“小时” , 分区起始边界值为下个小时整点,分区的间隔为period的值 - period设置为“天” , 分区起始边界值为第二天零点,分区的间隔为period的值 - period设置为“月” , 分区起始边界值为下个月零点,分区的间隔为period的值 - period设置为“年” , 分区起始边界值为明年零点,分区的间隔为period的值 ``` tsdb=# CREATE TABLE IF NOT EXISTS GENERATOR( tsdb(# dynamo text TSTag, tsdb(# manufacturer text TSTag, tsdb(# model text TSTag, tsdb(# location text TSTag, tsdb(# ID bigint TSTag, tsdb(# voltage numeric TSField, tsdb(# power bigint TSTag, tsdb(# frequency numeric TSField, tsdb(# angle numeric TSField, tsdb(# time timestamptz TSTime) with (orientation=TIMESERIES, period='1 hour', ttl='1 month') distribute by hash(model); CREATE TABLE tsdb=# select now(); now ------------------------------- 2022-05-25 15:28:38.520757+08 (1 row) tsdb=# select relname, boundaries from pg_partition where parentid=(select oid from pg_class where relname='generator') order by boundaries ; relname | boundaries ----------------+---------------------------- default_part_1 | {"2022-05-25 16:00:00+08"} default_part_2 | {"2022-05-25 17:00:00+08"} p1653505200 | {"2022-05-26 03:00:00+08"} p1653541200 | {"2022-05-26 13:00:00+08"} p1653577200 | {"2022-05-26 23:00:00+08"} ...... ``` 这样的使用方式,能够使得用户能够便捷快速的创建时序表。当然我们也支持在建表时用户手动指定分区边界的起始值。关于自动分区管理功能更详细的描述,可以参考《GaussDB(DWS) 分区自动管理介绍》。 ``` tsdb=# select now(); now ------------------------------- 2022-05-31 20:36:09.700096+08 (1 row) tsdb=# CREATE TABLE IF NOT EXISTS GENERATOR( tsdb(# dynamo text TSTag, tsdb(# manufacturer text TSTag, tsdb(# model text TSTag, tsdb(# location text TSTag, tsdb(# ID bigint TSTag, tsdb(# voltage numeric TSField, tsdb(# power bigint TSTag, tsdb(# frequency numeric TSField, tsdb(# angle numeric TSField, tsdb(# time timestamptz TSTime) with (orientation=TIMESERIES, period='1 day') distribute by hash(model) tsdb-# partition by range(time) tsdb-# ( tsdb(# PARTITION P1 VALUES LESS THAN('2022-05-30 16:32:45'), tsdb(# PARTITION P2 VALUES LESS THAN('2022-05-31 16:56:12') tsdb(# ); WARNING: partition boundary is less than current time. CREATE TABLE tsdb=# select relname, boundaries from pg_partition where parentid=(select oid from pg_class where relname='generator') order by boundaries ; relname | boundaries -------------+---------------------------- p1 | {"2022-05-30 16:32:45+08"} p2 | {"2022-05-31 16:56:12+08"} p1654073772 | {"2022-06-01 16:56:12+08"} p1654160172 | {"2022-06-02 16:56:12+08"} ...... ``` 至此,我们已经建成了自己的第一张时序表,接下来我们会针对时序表的DDL各种操作进行详细的实践,帮助大家学好、用好时序数据库,更好的为用户的业务服务。
  • [其他] GaussDB(DWS)网络监控部署
    【处理方法】1、检查网卡多队列是否配置:1)gs_check -i CheckMultiQueue(查看所有节点,需要输入root密码)2)for IRQ in `cat /proc/interrupts | grep -i eth1 | cut -d: -f1`;do cat /proc/irq/$IRQ/smp_affinity;done查询每列数字不一致则已配置,否则为配置2、重传监控while true;do date;netstat -anop|grep "on ("|grep ESTABLISHED|grep -v "/0/0"|sort -rnk3|head;echo;sleep 3;done3、gsar bond0 14、监控流量 sar -n DEV 15、网络队列 netstat -npt | grep gauss| sort -rnk 3| head -n 50网络问题定位参考:cid:link_0cid:link_16、查看bond组织方式:cat /etc/sysconfig/network-scripts/ifcfg-bond0cat /etc/sysconfig/ifcfg-bond07、message是否存在以下日志nf_conntrack: table full, dropping packetnf_conntrack_max控制(2048000)
  • [环境搭建] GaussDB 200 6.5.1 配置规划工具 04.xlsm---求模板
    【功能模块】GaussDB 200 6.5.1 配置规划工具 04.xlsm【操作步骤&问题现象】1、GaussDB 200 6.5.1 配置规划工具 04.xlsm这个模板 哪位大佬可以发给我一下,谢谢!
  • [萌新手册] GaussDB(DWS) 补丁、升级及扩容流程培训
    GaussDB(DWS) 补丁、升级及扩容流程培训
  • [技术干货] 华为云发布《云原生2.0架构白皮书》,GaussDB技术再升级
    近期,在华为伙伴暨开发者大会2022,华为云CTO张宇昕发布了《云原生2.0架构白皮书》,包括云原生数据库在内,介绍了云原生2.0的关键特征、架构模式,以及优秀实践,为企业数字化升级注入了云原生2.0新动力。华为云数据库首席架构师冯柯也在会上分享了云原生数据库HTAP重大特性商用,通过极致混合负载能力和及时精准的数据分析,助力企业商业决策。云原生数据库技术再创新早在去年,华为云便发布了《云原生2.0白皮书》,阐述了云原生2.0定义、价值及参考架构,解读了“资源高效、应用敏捷、业务智能、安全可信”四大价值以及预测未来发展趋势。而今年的《云原生2.0架构白皮书》,围绕架构升级,重点诠释了云原生2.0技术特征与架构设计模式,以云原生技术力量推动企业数字化转型升级。 云原生数据库作为白皮书的重要内容之一,在架构创新和技术特性方面均有重大突破。华为云云原生数据库GaussDB基于存算分离,并利用云原生数据库云存储 DFV 基于存储算子语义下推能力,支撑事务处理算子的并行下推;同时存储层支持日志回放能力,数据库写节点只需要把日志写到存储层,存储层就可以将日志回放为数据页面,并在多副本上提供一致性版本,大大节省了计算层和存储层的高速网络带宽。优化后的云原生GaussDB架构可以很好地解决热点数据问题,以及数据丢失、故障恢复等难题,面对客户高负载和各种复杂场景,表现更从容。 Serverless也是云原生数据库的关键特征之一。华为云云原生数据库GaussDB结合Serverless,只需创建数据库节点,指定所需的数据库容量范围,然后数据库处于工作状态期间按照每秒使用的数据库容量进行付费,同时利用华为云数据库的应用无损透明倒换技术 (ALT),规格变更可以实现应用基本无感知,让开发者专注于应用开发,无需关注资源。 此外,华为云数据库首席架构师冯柯还在会上介绍了云原生数据库GaussDB的另一重大特性——HTAP。云原生HTAP深度融合OLTP和OLAP两者优势,统一入口,自动分流,并且在行存和列存引擎上建立全局一致性事务视图,达到数据实时一致,支撑更多混合负载的场景。这种方式可以支持大量并发的更新,而且数据同步时延达到秒级或毫秒级,有效避免了传统解决方案中数据抽取、转换和装载等繁琐步骤,极大提升了数据处理的时效性,为企业提供实时精准的决策支持。目前该特性已正式商用。 云原生数据库优秀实践 云原生数据库GaussDB不仅在技术上硕果累累,还广泛应用于电商、制造业、交通、泛互联网等领域,历经关键行业的锤炼,并取得重大实践成果。 在电商行业,为了满足梦饷集团的发展需求,华为云云原生数据库GaussDB(for MySQL)助力梦饷集团打造高性能的云原生电商平台,通过平滑扩容和快速弹性升降能力,可从容应对突发业务流量,大促过后也可以及时回落,快速降低成本。而且运维效率提升约 30%,每秒成交的订单数再创历史新高,成为了利用数字基础设施助力业务快速增长的标杆。 在汽车行业,华为云云原生数据库GaussDB(for MySQL)成功助力中国一汽红旗ERP系统微服务改造升级,ERP 系统整体性能大幅提升,流量洪峰下业务运行又快又稳;提供了开放的 MySQL 生态,各业务协同更灵活。使用成本方面,每台数据库由原来最低600+万/年降低至100+万/年;生产效率方面,由原来几天才能出货 bom 单到最快 20 分钟内即可计算出一个生产计划的 bom 单;微服务的拆分提升了系统稳定性,提高了业务交付速度,系统扩展性更强。 云原生数据库未来趋势 云原生技术浪潮汹涌澎湃,一日千里,云原生2.0之后,我们如何踏浪前行、乘风破浪? 未来的技术世界我们无法掌控,但从现状出发,我们或许可以窥见端倪。随着跨Region技术的增强,高资源利用率的驱动,以及Serverless的普遍诉求,去 Region 化、智能弹性、Serverless数据库将是未来发展方向。 但在此之前,云原生数据库还有一段路要走,比如Serverless数据库未来需要具备智能弹性的能力,能够根据用户的历史负载计算出用户画像,依赖秒级监控能力,快速判断用户未来的负载趋势,提前为用户弹性伸缩好资源,避免用户负载冲击到资源规格上限,减少系统资源浪费。 虽有一定挑战,但也极具动力,华为云云原生数据库GaussDB将凝聚技术力量,锐意创新,助力更多企业业务智能化升级,深化数据服务能力,推进千行百业数字化转型。
  • [技术干货] 智慧园区数据平台DO GaussDB 100数据库关键字合集
    关键字GaussDB 100数据库中关键字就是有特殊用途的标识符,是数据库事先定义好的,有保留字和非保留字之分。根据标准,保留字决不能用做其他标识符,如:不能用作保留字段做表名、字段名等。非保留字只是在特定的环境里有特殊的含义,而在其他环境里是可以用做标识符的。表1 GaussDB 100关键字1ABORTABSOLUTEACCESSACCOUNT2ACTIONADDADMINAFTER3AGGREGATEALIASALLALSO4ALTERALWAYSANALYSEANALYZE5ANDANYARRAYAS6ASCASSERTIONASSIGNMENTASYMMETRIC7ATATTRIBUTEAUTHIDAUTHORIZATION8AUTOEXTENDBACKWARDBEFOREBEGIN9BETWEENBIGINTBINARYBINARY_DOUBLE10BINARY_INTEGERBITBLOBBOOLEAN11BOTHBYBYTEACACHE12CALLCALLEDCASCADECASCADED13CASECASTCATALOGCHAIN14CHARCHARACTERCHARACTERISTICSCHECK15CHECKPOINTCLASSCLOBCLOSE16CLUSTERCOALESCECOLLATECOLLATION17COLUMNCOMMENTCOMMENTSCOMMIT18COMMITTEDCOMPILECONCURRENTLYCONFIGURATION19CONNECTCONNECTIONCONSTRAINTCONSTRAINTS20CONTENTCONTENTSCONTEXTCONTINUE21CONVERSIONCOPYCOSTCREATE22CROSSCSVCURRENTCURRENT_CATALOG23CURRENT_DATECURRENT_ROLECURRENT_SCHEMACURRENT_TIME24CURRENT_TIMESTAMPCURRENT_USERCURSORCYCLE25DATADATABASEDATAFILEDATAFILES26DATEDAYDBTIMEZONEDEALLOCATE27DEBUGDECDECIMALDECLARE28DECODEDEFAULTDEFAULTSDEFERRABLE29DEFERREDDEFINERDELETEDELIMITER30DELIMITERSDESCDETAILDETERMINISTIC31DIAGNOSTICSDICTIONARYDIRECTORYDISABLE32DISCARDDISTINCTDODOCUMENT33DOMAINDOUBLEDROPDUMP34EACHELSEELSEIFELSIF35ENABLEENCODINGENCRYPTEDEND36ENUMERRCODEERRORESCAPE37EXCEPTEXCEPTIONEXCLUDEEXCLUDING38EXCLUSIVEEXECEXECUTEEXISTS39EXITEXPLAINEXTENSIONEXTERNAL40EXTRACTFALSEFAMILYFETCH41FIRSTFLOATFOLLOWINGFOR42FORALLFORCEFOREACHFOREIGN43FORWARDFREEZEFROMFULL44FUNCTIONFUNCTIONSGETGLOBAL45GRANTGRANTEDGREATESTGROUP46HANDLERHAVINGHEADERHINT47HOLDHOURIDENTIFIEDIDENTITY48IFILIKEIMMEDIATEIMMUTABLE49IMPLICITININCLUDINGINCREMENT50INDEXINDEXESINDEXTYPEINFO51INHERITINHERITSINITIALINITIALLY52INITRANSINLINEINNERINOUT53INPUTINSENSITIVEINSERTINSTEAD54INTINTEGERINTERSECTINTERVAL55INTOINVOKERISISNULL56ISOLATIONJOINKEYLABEL57LANGUAGELARGELASTLC_COLLATE58LC_CTYPELEADINGLEASTLEFT59LESSLEVELLEXERLIKE60LIMITLINKLISTENLOAD61LOCALLOCALTIMELOCALTIMESTAMPLOCATION62LOCKLOGLOGGINGLOOP63MAPPINGMATCHMAXEXTENTSMAXSIZE64MAXTRANSMAXVALUEMESSAGEMESSAGE_TEXT65MINEXTENTSMINUSMINUTEMINVALUE66MODEMODIFYMONTHMOVE67NAMENAMESNATIONALNATURAL68NCHARNEXTNLSSORTNO69NOCACHENOCYCLENOLOGGINGNONE70NOMAXVALUENOMINVALUENOORDERNOREVERSE71NOTNOTHINGNOTIFYNOTICE72NOTNULLNOWAITNULLNULLIF73NULLSNUMBERNUMERICNVARCHAR274NVLOBJECTOFOFF75OFFSETOIDSONONLY76OPENOPERATOROPTIONOPTIONS77ORORDEROUTOUTER78OVEROVERLAPSOVERLAYOWNED79OWNERPARAMETERSPARSERPARTIAL80PARTITIONPASSINGPASSWORDPCTFREE81PERFORMPG_EXCEPTION_CONTEXTPG_EXCEPTION_DETAILPG_EXCEPTION_HINT82PLACINGPLANSPOSITIONPRECEDING83PRECISIONPREPAREPREPAREDPRESERVE84PRIMARYPRIORPRIVILEGEPRIVILEGES85PROCEDURALPROCEDUREPROFILEQUERY86QUOTERAISERANGERAW87READREALREASSIGNRECHECK88RECURSIVEREFREFERENCESREINDEX89RELATIVERELEASERENAMEREPEATABLE90REPLACEREPLICARESETRESTART91RESTRICTRESULT_OIDRETURNRETURNED_SQLSTATE92RETURNINGRETURNSREUSEREVERSE93REVOKERIGHTROLEROLLBACK94ROWROWIDROWNUMROWS95ROWTYPEROW_COUNTRULESAVEPOINT96SCHEMASCROLLSECONDSECURITY97SELECTSEQUENCESEQUENCESSERIALIZABLE98SERVERSESSIONSESSIONTIMEZONESESSION_USER99SETSETOFSHARESHOW100SIMILARSIMPLESIZESLICE101SMALLINTSOMESQLSTATESTABLE102STACKEDSTANDALONESTARTSTATEMENT103STATISTICSSTDINSTDOUTSTOPLIST104STORAGESTRICTSTRIPSUBSTRING105SYMMETRICSYSDATESYSIDSYSTEM106SYSTIMESTAMPSYS_REFCURSORTABLETABLES107TABLESPACETEMPTEMPLATETEMPORARY108TEXTTHANTHENTIME109TIMESTAMPTOTRAILINGTRANSACTION110TREATTRIGGERTRIMTRUE111TRUNCATETRUSTEDTYPETYPES112UNBOUNDEDUNCOMMITTEDUNENCRYPTEDUNION113UNIQUEUNKNOWNUNLIMITEDUNLISTEN114UNLOCKUNLOGGEDUNTILUPDATE115USE_COLUMNUSE_VARIABLEUSERUSING116VACUUMVALIDVALIDATEVALIDATOR117VALUEVALUESVARCHARVARCHAR2118VARIABLE_CONFLICTVARIADICVARRAYVARYING119VERBOSEVERSIONVIEWVOLATILE120WARRINGWHENWHEREWHILE121WHITESPACEWINDOWWITHWITHOUT122WORKWRAPPERWRITEXML123XMLATTRIBUTESXMLCONCATXMLELEMENTXMLEXISTS124XMLFORESTXMLPARSEXMLPIXMLROOT125XMLSERIALIZEYEARYESZONE
  • [技术干货] 智慧园区数据平台DO GaussDB 200数据库关键字合集
    GaussDB 200数据库中,保留字决不能用做其他标识符。非保留字只是在特定的环境里有特殊的含义,而在其他环境里是可以用做标识符的。保留关键字和非保留关键字的约束与其他数据库一致,保留字任何地方都不能用。非保留,在特定场景下可以用。一般建议不要使用关键字做表名或者字段名。表1 GaussDB 200关键字1ABORTABSABSOLUTEACCESS2ACCOUNTACTIONADAADD3ADMINAFTERAGGREGATEALIAS4ALLALLOCATEALSOALTER5ALWAYSANALYSEANALYZEAND6ANYAPPAREARRAY7ASASCASENSITIVEASSERTION8ASSIGNMENTASYMMETRICATATOMIC9ATTRIBUTEAUTHIDAUTHORIZATIONAUTOEXTEND10AUTOMAPPEDAVGBACKWARDBARRIER11BEFOREBEGINBETWEENBIGINT12BINARYBINARY_DOUBLEBINARY_INTEGERBIT13BITVARBIT_LENGTHBLOBBOOLEAN14BOTHBUCKETSBREADTHBY15CCACHECALLCALLED16CARDINALITYCASCADECASCADEDCASE17CASTCATALOGCATALOG_NAMECHAIN18CHARCHARACTERCHARACTERISTICSCHARACTER_LENGTH19CHARACTER_SET_CATALOGCHARACTER_SET_NAMECHARACTER_SET_SCHEMACHAR_LENGTH20CHECKCHECKEDCHECKPOINTCLASS21CLEANCLASS_ORIGINCLOBCLOSE22CLUSTERCOALESCECOBOLCOLLATE23COLLATIONCOLLATION_CATALOGCOLLATION_NAMECOLLATION_SCHEMA24COLUMNCOLUMN_NAMECOMMAND_FUNCTIONCOMMAND_FUNCTION_CODE25COMMENTCOMMENTSCOMMITCOMMITTED26COMPATIBLE_ILLEGAL_CHARSCOMPLETECOMPRESSCOMPLETION27CONCURRENTLYCONDITIONCONDITION_NUMBERCONFIGURATION28CONNECTCONNECTIONCONNECTION_NAMECONSTRAINT29CONSTRAINTSCONSTRAINT_CATALOGCONSTRAINT_NAMECONSTRAINT_SCHEMA30CONSTRUCTORCONTAINSCONTENTCONTINUE31CONVERSIONCONVERTCOORDINATORCOPY32CORRESPONDINGCOSTCOUNTCREATE33CROSSCSVCUBECURRENT34CURRENT_CATALOGCURRENT_DATECURRENT_PATHCURRENT_ROLE35CURRENT_SCHEMACURRENT_TIMECURRENT_TIMESTAMPCURRENT_USER36CURSORCURSOR_NAMECYCLEDATA37DATE_FORMATDATABASEDATAFILEDATE38DATETIME_INTERVAL_CODEDATETIME_INTERVAL_PRECISIONDAYDBCOMPATIBILITY39DEALLOCATEDECDECIMALDECLARE40DECODEDEFAULTDEFAULTSDEFERRABLE41DEFERREDDEFINEDDEFINERDELETE42DELIMITERDELIMITERSDELTADEPTH43DEREFDESCDESCRIBEDESCRIPTOR44DESTROYDESTRUCTORDETERMINISTICDIAGNOSTICS45DICTIONARYDIRECTDISABLEDISCARD46DISCONNECTDISPATCHDISTINCTDISTRIBUTE47DISTRIBUTIONDODOCUMENTDOMAIN48DOUBLEDROPDYNAMICDYNAMIC_FUNCTION49DYNAMIC_FUNCTION_CODEEACHELASTICELSE50ENABLEENCODINGENCRYPTEDEND51END-EXECENFORCEDENUMEOL52EQUALSERRORSESCAPEESCAPING53EVERYEXCEPTEXCEPTIONEXCHANGE54EXCLUDEEXCLUDINGEXCLUSIVEEXEC55EXECUTEEXISTINGEXISTSEXPLAIN56EXTENSIONEXTERNALEXTRACTFALSE57FAMILYFASTFENCEDFETCH58FILEHEADERFILL_MISSING_FIELDSFINALFIRST59FIXEDFLOATFOLLOWINGFOR60FORCEFOREIGNFORMATTERFORTRAN61FORWARDFOUNDFREEFREEZE62FROMFULLFUNCTIONFUNCTIONS63GGENERALGENERATEDGET64GLOBALGOGOTOGRANT65GRANTEDGREATESTGROUPGROUPING66HANDLERHAVINGHEADERHIERARCHY67HOLDHOSTHOURIDENTIFIED68IDENTITYIFIGNOREIGNORE_EXTRA_DATA69ILIKEIMMEDIATEIMMUTABLEIMPLEMENTATION70IMPLICITININCLUDINGINCREMENT71INDEXINDEXESINDICATORINFIX72INHERITINHERITSINITIALINITIALIZE73INITIALLYINITRANSINLINEINNER74INOUTINPUTINSENSITIVEINSERT75INSTANCEINSTANTIABLEINSTEADINT76INTEGERINTERNALINTERSECTINTERVAL77INTOINVOKERISISNULL78ISOLATIONITERATEJOINK79KEYKEY_MEMBERKEY_TYPELABEL80LANGUAGELARGELASTLATERAL81LC_COLLATELC_CTYPELEADINGLEAKPROOF82LEASTLEFTLENGTHLESS83LEVELLIKELIMITLISTEN84LOADLOCALLOCALTIMELOCALTIMESTAMP85LOCATIONLOCATORLOCKLOG86LOGGINGLOGINLOOPLOWER87MMAPMAPPINGMATCH88MATCHEDMAXMAXEXTENTSMAXSIZE89MAXTRANSMAXVALUEMERGEMESSAGE_LENGTH90MESSAGE_OCTET_LENGTHMESSAGE_TEXTMETHODMIN91MINEXTENTSMINUSMINUTEMINVALUE92MODMODEMODIFIESMODIFY93MODULEMONTHMOREMOVE94MOVEMENTMUMPSNAMENAMES95NATIONALNATURALNCHARNCLOB96NEWNEXTNLSSORTNO97NOCOMPRESSNOCYCLENODENOLOGGING98NOLOGINNOMAXVALUENOMINVALUENONE99NOTNOTHINGNOTIFYNOTNULL100NOWAITNULLNULLABLENULLIF101NULLSNUMBERNUMERICNUMSTR102NVARCHAR2NVLOBJECTOCTET_LENGTH103OFOFFOFFSETOIDS104OLDONONLYOPEN105OPERATIONOPERATOROPTIMIZATIONOPTION106OPTIONSORORDERORDINALITY107OUTOUTEROUTPUTOVER108OVERLAPSOVERLAYOVERRIDINGOWNED109OWNERPACKAGEPADPARAMETER110PARAMETERSPARAMETER_MODEPARAMETER_NAMEPARAMETER_ORDINAL_POSITION111PARAMETER_SPECIFIC_CATALOGPARAMETER_SPECIFIC_NAMEPARAMETER_SPECIFIC_SCHEMAPARSER112PARTIALPARTITIONPARTITIONSPASCAL113PASSINGPASSWORDPATHPCTFREE114PERPERMPERCENTPERFORMANCE115PLACINGPLANPLANSPLI116POLICYPOOLPOSITIONPOSTFIX117PRECEDINGPRECISIONPREFERREDPREFIX118PREORDERPREPAREPREPAREDPRESERVE119PRIMARYPRIORPRIVATEPRIVILEGE120PRIVILEGESPROCEDURALPROCEDUREPROFILE121PUBLICQUERYQUOTERANGE122RAWREADREADSREAL123REASSIGNREBUILDRECHECKRECURSIVE124REFREFERENCESREFERENCINGREINDEX125REJECTRELATIVERELEASERELOPTIONS126REMOTERENAMEREPEATABLEREPLACE127REPLICARESETRESIZERESOURCE128RESTARTRESTRICTRESULTRETURN129RETURNED_LENGTHRETURNED_OCTET_LENGTHRETURNED_SQLSTATERETURNING130RETURNSREUSEREVOKERIGHT131ROLEROLLBACKROLLUPROUTINE132ROUTINE_CATALOGROUTINE_NAMEROUTINE_SCHEMAROW133ROWSROW_COUNTRULESAVEPOINT134SCALESCHEMASCHEMA_NAMESCOPE135SCROLLSEARCHSECONDSECTION136SECURITYSELECTSELFSENSITIVE137SEQUENCESEQUENCESSERIALIZABLESERVER138SERVER_NAMESESSIONSESSION_USERSET139SETOFSETSSHARESHIPPABLE140SHOWSIMILARSIMPLESIZE141SMALLDATETIMESMALLDATETIME_FORMATSMALLINTSNAPSHOT142SOMESOURCESPACESPECIFIC143SPECIFICTYPESPECIFIC_NAMESPILLSPLIT144SQLSQLCODESQLERRORSQLEXCEPTION145SQLSTATESQLWARNINGSTABLESTANDALONE146STARTSTATESTATEMENTSTATEMENT_ID147STATICSTATISTICSSTDINSTDOUT148STORAGESTORESTRICTSTRIP149STRUCTURESTYLESUBCLASS_ORIGINSUBLIST150SUBSTRINGSUMSUPERUSERSYMMETRIC151SYNONYMSYS_REFCURSORSYSDATESYSID152SYSTEMSYSTEM_USERTABLETABLES153TABLE_NAMETEMPTEMPLATETEMPORARY154TERMINATETEXTTHANTHEN155TIMETIME_FORMATTIMESTAMPTIMESTAMP_FORMAT156TIMEZONE_HOURTIMEZONE_MINUTETINYINTTO157TRAILINGTRANSACTIONTRANSACTIONS_COMMITTEDTRANSACTIONS_ROLLED_BACK158TRANSACTION_ACTIVETRANSFORMTRANSFORMSTRANSLATE159TRANSLATIONTREATTRIGGERTRIGGER_CATALOG160TRIGGER_NAMETRIGGER_SCHEMATRIMTRUE161TRUNCATETRUSTEDTYPETYPES162UESCAPEUNBOUNDEDUNCOMMITTEDUNDER163UNENCRYPTEDUNIONUNIQUEUNKNOWN164UNLIMITEDUNLISTENUNLOCKUNLOGGED165UNNAMEDUNNESTUNTILUNUSABLE166UPDATEUPPERUSAGEUSER167USER_DEFINED_TYPE_CATALOGUSER_DEFINED_TYPE_NAMEUSER_DEFINED_TYPE_SCHEMAUSING168VACUUMVALIDVALIDATEVALIDATION169VALIDATORVALUEVALUESVARCHAR170VARCHAR2VARIABLEVARIADICVARYING171VCGROUPVERBOSEVERIFYVERSION172VIEWVOLATILEWHENWHENEVER173WHEREWHITESPACEWINDOWWITH174WITHINWITHOUTWORKWORKLOAD175WRAPPERWRITEXMLXMLATTRIBUTES176XMLCONCATXMLELEMENTXMLEXISTSXMLFOREST177XMLPARSEXMLPIXMLROOTXMLSERIALIZE178YEARYESZONE-
  • [实践系列] DWS SQL调优的一些总结
    0. 统计信息-- 统计信息是动态调优的核心信息输入,统计信息准确与否,至关重要0.1 低效算子-- NEST LOOP0.2 不下推分析优化器在分布式框架下有三种执行计划优化策略* 下推语句执行计划:CN发送查询语句到DN直接执行,执行结果返回给CN。(DN间无需数据交换场景) 特征:Data Node Scan on *_REMOTE_FQS_QUERY_*例如:create table t1(a int,b int) distribute by (a);create table t2(a int,b int) distribute by (a);explain verbose select t1.* from t1  join t2 on t1.a = t2.a;-- t1和t2 都是分布表,t1.a 和 t2.a都是其分布列,join能匹配到的数据都在同一个DN上,因此DN间不需要数据交换,原语句直接下发到DN上执行即可。-- 此种语句在CH上打印的执行计划信息较少,可直接在DN上打印详细执行信息* 分布式计划:CN生成计划树,发送计划树给DN执行;DN执行完成后,将结果返回给CN。 特征:Streaming (type:GATHER) broadcast : 全表广播。全表数据量的数据向所有DN传输 redistribute : 重分布。不多于全表数据量的数据向所有DN传输。性能优于 broadcast gather :聚合流。聚合流将数据从多个查询片段聚合到一个。* 不下推执行计划:CN承担大量计算任务,导致性能劣化。优化器将部分查询(多为基表扫描语句,DN只扫描、不计算,不过滤)下推到DN执行,将获取到的中间结果返回给CN,CN再执行计划剩余的部分。 特征:Data Node Scan + _REMOTE_XXX 0.3 --优化思路和手段1.扫描慢1.1 建立单字段分区或多字段分区-- 逻辑上的一张表根据某种方案分成几张物理块进行存储,这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。-- 目前行存表、列存表仅支持范围分区和列表分区。(8.1.3)-- 有限地支持唯一约束和主键约束,即唯一约束和主键约束的约束键必须包含所有分区键。-- VACUUM和ANALYZE只会对主表起作用,要想分析分区表,需要分别分析每个分区表。-- 数据迁移到分区表后建议禁用主表,如果主表未执行vacuum操作,那么执行计划会全表扫描主表,非常耗时。•查看分区表信息,可使用系统表dba_tab_partitions。select * from dba_tab_partitions where table_name='tpcds.customer_address' --单子段分区partition by range(followup_create_time)(    partition p1 START('2022-01-01') END ('2022-06-30') EVERY (INTERVAL '1 day')) partition by range(order_date)(    partition p1 START('2022-01-01'::TIMESATMP(0)) END ('2022-06-30'::TIMESTAMP(0)) EVERY (INTERVAL '3 months')))  -- 多字段分区(多字段分区不能使用START END 来指定分区) WITH (orientation=column, compression=low, colversion=2.0, enable_delta=false) DISTRIBUTE BY HASH(imsi) PARTITION BY RANGE (idperiodo, idcalendario) (          PARTITION p_20201231 VALUES LESS THAN (202101, 20210101) TABLESPACE pg_default,          PARTITION p_20210101 VALUES LESS THAN (202101, 20210102) TABLESPACE pg_default)-- 查询分区select * from table_name partition('partition_name');1.1 行存表:建立btree保序索引 -- 涉及排序场景建立btree索引,目前行存btree索引保持排序,列存不保存排序结果。但是建立索引后,因为要排序,所以表在插入、更新时会有一定的性能影响。CREATE INDEX dws_tt_flink_eos_wide_01 ON dws_tt_flink_eos_wide USING btree(followup_create_time) local;1.2 列存表建立PCK(Partial Cluster Key(局部聚簇));局部聚簇存储,列存表导入数据时按照指定的列(单列或多列),进行局部排序。-- 一个表只能建立一个PCK-- 一个PCK可以包含多列,但是不建议超过两列-- 建议在查询中的简单表达式的过滤条件上建立PCK;如column >,=,< 常量。-- 在满足上面条件的情况下,选择distinct值比较少的列建立PCKCREATE TABLE tpcds.warehouse_t21(    W_WAREHOUSE_SK            INTEGER         NOT NULL,    PRIMARY KEY (column_name1,column_name2),    PARTIAL CLUSTER KEY(column_name1,column_name2))WITH (orientation=column, compression=low, colversion=2.0, enable_delta=false) DISTRIBUTE BY REPLICATION; 2.表结构orientation不支持修改。行列存储方式一旦建立,不能修改行存表:-- 点查询场景(大基表单表过滤查询,返回结果少,基于索引的简单查询,比如btree排序索引)-- 增删改较多的场景,并发增删改;实时数据接入等-- 行存表压缩功能暂未商用,如需使用请联系技术支持工程师。列存表:-- 多表关联的统计分析类场景-- 即席查询(查询条件列不确定,行存无法确定索引)-- 多表关联查询、聚合、分组查询等,访问大量行,少数列的场景。数据类型:-- 数据类型合理 变长可以变为定长的一律改为定长;变长在方便的同时,肯定会影响性能。-- 多个表间存在逻辑关系时,表示同一含义字段使用相同类型。字符串字段尽量使用变长数据类型。不建议使用定长数据类型。text,carchar  --> char(8)numeric(12,0) --> bigint2.1分布键选择合理 (不同DN间相差5%以上即可认为倾斜,10%以上必须调整分布列)-- ◾当指定DISTRIBUTE BY HASH (column_name)参数时,创建主键和唯一索引必须包含分布键。-- 查询数据分布:select table_skewness('table_name');-- 不指定分布方式时,默认第一个字段为分布键,进行hash分布-- 通常选取表的主键作为分布列-- 选择查询中关联条件作为分布列,以便Join任务可以下推到DN执行,且减少DN间的通信数据量。-- 复杂查询场景下,尽量不要选取存在常量等值过滤的列,避免剪枝后扫描集中在部分DN上。-- 点查询场景下,则应该尽量选取WHERE条件中的等值过滤条件列作为分布列。2.2 维度小表建立复制表  ,列存(数据量10万以下)CREATE TABLE tpcds.warehouse_t21(    W_WAREHOUSE_SK            INTEGER               NOT NULL)WITH (orientation=column, compression=low, colversion=2.0, enable_delta=false) DISTRIBUTE BY REPLICATION;2.3 列存表涉及更新,开启delta,不过在实时更新频繁时,还是搞不定,比如RDS服务实时导入数据的表,只能为行存表。CREATE TABLE tpcds.warehouse_t21(    W_WAREHOUSE_SK            INTEGER               NOT NULL)WITH (orientation=column, compression=low, colversion=2.0, enable_delta=on) DISTRIBUTE BY REPLICATION;2.4 行存表强制打开向量化(GUC控制台参数),执行计划走列存向量set enable_force_vector_engine=on-- 干预执行计划:best_agg_plan-- Stream执行框架分为如下三种计划形态:-- hashagg+gather(redistribute)+hashagg-- redistribute+hashagg(+gather)-- hashagg+redistribute+hashagg(+gather)-- GaussDB(DWS)提供了guc参数best_agg_plan来干预执行计划,强制其生成上述对应的执行计划,此参数取值范围为0,1,2,3-- •取值为1时,强制生成第一种计划。-- •取值为2时,如果group by列可以重分布,强制生成第二种计划,否则生成第一种计划。-- •取值为3时,如果group by列可以重分布,强制生成第三种计划,否则生成第一种计划。-- •取值为0时,优化器会根据以上三种计划的估算代价选择最优的一种计划生成。3.模糊匹配-- 建立全文索引create index index_name on table_name using gin(to_tsvector(col_name));select * from table_name where to_tsvector(col_name) @@ plainto_tsquery('某公司')----where            to_tsvector('zhparser',ef.remark ) @@ to_tsquery('%hiphi%')           --  ef.remark  like '%hiphi%'4.查询数据库大小(已用空间)select datname,pg_size_pretty(pg_database_size(datname)) from pg_database; 5.改写SQL5.1 not in -——> not exists6.query dop的输出信息含义Initial DOP: 7   -- 初始DOP  Avail(CPU/IO)/Max core: (7.92/8.00)/8.00        -- 语句可用CPU/IO/最大核数CPU/IO/Task util: 1.00/0.00/0                   -- 当前最大CPU/IO/DN作业个数Running/Active/Max statement: 160/0/21474836     --当前DN正在运行作业数/进入CN作业数/允许最大作业数(ma)Final Max DOP: 6   -- 最终DOP7.数据库float数据类型,小数点前面的0不显示oracle兼容的不显示小数点前的0,mysql兼容的显示;-- 创建兼容ORA格式的数据库:CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'ORA';-- DBCOMPATIBILITY [ = ] compatibilty_type;指定兼容的数据库的类型。取值范围:ORA、TD、MySQL。分别表示兼容Oracle、Teradata和MySQL数据库。若不指定该参数,默认为ORA。8.清空表:推荐使用truncate  操作,因为truncate操作会物理的清空数据表,并将其占用的空间归还给操作系统。
  • [技术干货] 探秘GaussDB,打造坚实金融数据新底座
    6月16日,2022年华为伙伴暨开发者大会在线上顺利进行,会上集结了众多行业专家、合作伙伴和客户,一起共话行业前沿趋势,探索技术新发展。在“探秘GaussDB,打造坚实金融数据新底座”专场,华为云数据库首席架构师冯柯、工商银行软件开发中心高级经理董勇明、上海掌数科技有限公司首席顾问邹昌根和华为云数据库创新LAB主任张文亮以线上的形式现身,与我们分享了GaussDB最新技术趋势,以及与华为云GaussDB合作背后的故事和实践经验。华为云GaussDB 技术创新之路永不停歇持续创新是华为一直以来坚持在做的事。当前,随着5G、IoT、AI、大数据的快速发展,数据量爆发式增长,数据库云化进一步提升,数据库行业也迎来了云原生2.0时代,这对数据库的性能、可靠性、可用性都有了更高的要求。华为云GaussDB多年来持续聚焦技术创新,构建以应用为中心的新型数据库云服务,让客户聚焦业务创新。在此次大会上,华为云数据库首席架构师冯柯重点介绍了刚刚正式商用的GaussDB云原生HTAP,如何为业务提供更加及时精准的数据分析,助力商业决策;ALT应用无损透明技术如何在遭遇故障、运维以及实例变更时保持业务不中断,实现真正的业务高可用;创新性地将NDP(Near Data Processing, 近数据处理) 和PQ(Parallel Query, 并行查询)相结合,打造了NDPQ(近数据并行处理),打破复杂查询性能天花板。GaussDB技术的优势正在赋能越来越多的企业客户实现高效数字化转型。工商银行核心系统转型 聚焦技术硬实力 夯实数据新底座“在数字化升级的道路上,我们选择了华为云GaussDB作为优秀的合作伙伴。”工商银行软件开发中心高级经理董勇明在分享中提到,工商银行对自身的核心交易系统的诉求有清晰的认知,自2019年和GaussDB联创以来,已有20多个业务系统相继试点上线。去年,在开放平台大型业务系统传统集中式数据库转型领域,双方持续技术攻关,初步形成了整套的系统性技术资产和解决方案,为金融行业提供了低成本、高效可控的转型借鉴。 “这一路的联创实践,充分验证了传统集中式数据库向分布式数据库转型的可行性,为大型商业银行核心系统转型趟出了一条宽阔的道路。未来,工商银行将继续依托产学研联合创新机制,与包括华为在内业界领先企业深入开展联合技术攻关与融合共建,共建金融科技新生态”董勇明说。 掌数科技&华为云GaussDB 助力证券行业金融创新  打造行业标杆“数据库技术作为根技术,在华为生态体系建设中是非常重要的,这也是我们所看重的。”上海掌数科技有限公司首席顾问邹昌根说到。 掌数科技是一家聚焦于证券和大资管行业,面向数据库和大数据技术、智能化场景应用以及行业信息技术应用创新领域的金融科技企业,服务于全国80+大型金融机构客户。 掌数科技作为华为在金融证券行业首家数据库技术领域的全面合作伙伴,以法人清算系统为行业典型应用场景,形成了以GaussDB为数据底座的一系列全栈式金融创新方案,并已经在证券行业展开试点应用。该方案不仅规划设计了两地三中心的网络高可用架构,也提供了完善的容灾安全保障,以及一整套、全面的基于GaussDB的技术支撑与服务体系。 邹昌根表示:“我们期待通过与华为云GaussDB的合作,能够从多个维度保障创新项目的实施落地,让行业充分感知价值,展现我们优秀的实践经验;我们也将共同推进服务能力与体系建设,从而真正形成完整的GaussDB生态体系。”探秘openGemini 共建开源时序数据库新生态同时,在GaussDB数据库专场,华为云数据库创新LAB主任张文亮也对刚刚开源的时序时空数据库做了技术解读。“为了更好地推动数字化产业的创新发展,我们决定把自己的时序数据库GaussDB(for Influx)对外开源,开源社区叫openGemini,这是继openGauss开源之后,华为开源的又一数据库根技术。”张文亮说。 openGemini时序时空数据库面向物联网、运维监控等业务场景,具备创新的架构设计、卓越的读写性能、高效的数据分析能力和数据压缩能力,帮助企业经济高效地处理海量时序数据。openGemini开源后将秉持着“基于创新技术、贡献产业发展,开放合作,共建共享”的生态策略,和开发者、企业一起,完善周边工具和南北向的生态,共同繁荣openGemini的技术生态。 展望未来,华为云GaussDB将持续深耕技术创新,继续携手工商银行和掌数科技,以及越来越多的企业伙伴,以技术赋能业务数字化升级,并持续贡献openGauss和openGemini开源生态,为行业发展创造更多价值!
  • [技术干货] 智慧园区数据平台DO GaussDB 100和GaussDB 200的差异点(下)
    字段的类型校验GaussDB 100数据库:对字段的类型校验严格,如果两个表的关联字段类型不匹配,那关联时会失败;同时源表里的字段和目标表里面对应的字段不匹配,在插入到表时也会报错。在GaussDB 100数据库中,在关联查询中,每个临时表中的字段通过转换函数明确类型,字段类型和表模型保持一致。例如:脚本中查询临时表的多条select语句通过UNION ALL联合,select语句中的每个临时表中的字段都需要通过转换函数明确类型,字段类型和表模型保持一致。表6 字段的类型校验GaussDB 100数据库:对字段的类型校验严格GaussDB 200数据库:对字段的类型校验不严格,类型转换比较灵活。insert into dm_energy.dm_energy_coldsite_control_indicator_f( park_code ) select * from( select T.park_code :: character varying(100) from T where T.is_freeze_flow_speed :: boolean = true union all select T.park_code :: character varying(100) from T where T.is_freeze_flow_speed :: boolean = false);insert into dm_energy.dm_energy_coldsite_control_indicator_f( park_code ) select * from( select T.park_code from T where T.is_freeze_flow_speed = true union all select T.park_code from T where T.is_freeze_flow_speed = false);时间格式在GaussDB 100数据库中,to_timestamp函数需要格式化时间和规定格式需要一致。to_timestamp('2020-07-16 00:00:00','YYYY-MM-DD HH24:mi:SS')(支持) to_timestamp('20200716000000','YYYYMMDDHH24miSS') 转换后时间格式均为YYYY-MM-DD HH24:mi:SS(支持) to_timestamp('20200716000000','YYYY-MM-DD HH24:mi:SS') (不支持)GaussDB 200数据库:to_timestamp函数需要格式化时间和规定格式可以不一致。to_timestamp('2020-07-16 00:00:00','YYYY-MM-DD HH24:mi:SS')(支持) to_timestamp('20200716000000','YYYY-MM-DD HH24:mi:SS') (支持)
  • [技术干货] 智慧园区数据平台DO GaussDB 100和GaussDB 200的差异点(中)
    GaussDB 100的SQL语句使用别名表5 SQL语句的别名在GaussDB 100数据库中,SQL语句不支持直接使用别名。在一条SQL的where条件后使用数据库表里面的字段,而不是重命名的字段。GaussDB 200数据库:SQL语句支持直接使用别名单表简单查询: select workorder_id as order_id from dwi_order.dwi_order_instance where workorder_id = '441911'; 嵌套子查询: select "record_time","electricity_price" , "cost" as count1, "park_code" from ( SELECT record_time as "record_time", electricity_price as "electricity_price", cost as "cost", park_code as "park_code" FROM dm_energy.dm_energy_coldsite_cost_f a where 1=1 order by record_time asc) where "cost" = 1; 两个表关联查询: select substr(to_char(inc.occur_date,'yyyy-MM-dd'),1,10) occur_date_key, inc.alarm_def_category_type_id, inc.incident_type as type, inc.incident_type_cn as type_cn, count(incident_type) cot , inc.dw_batch_number , spa.park_code from (select * from dwr_event.dwd_event_incident_records_f tab1 where not exists(select 1 from dwr_event.dwd_event_incident_records_f where incident_code=tab1.incident_code and dw_batch_number>tab1.dw_batch_number) ) inc --关联空间维表 left join dwr_dim.dim_space_record_d spa on inc.space_code=spa.id where inc.incident_type in ('SafetyAlarm','FireAlarm') and incident_code not in (select incident_code from dwr_event.dwd_event_incident_records_f where 1=1 ) group by inc.alarm_def_category_type_id,inc.occur_date,type_cn,inc.incident_type,inc.dw_batch_number,park_code;单表简单查询: select workorder_id as order_id from dwi_order.dwi_order_instance where order_id = '441911'; 嵌套子查询: select "record_time", "electricity_price", "cost" as count1, "park_code" from ( SELECT record_time as "record_time", electricity_price as "electricity_price", cost as "cost", park_code as "park_code" FROM dm_energy.dm_energy_coldsite_cost_f a where 1=1 order by record_time asc) where count1 = 1; 两个表关联查询: select substr(to_char(inc.occur_date,'yyyy-MM-dd'),1,10) occur_date_key, inc.alarm_def_category_type_id, inc.incident_type as type, inc.incident_type_cn as type_cn, count(incident_type) cot , inc.dw_batch_number , spa.park_code from (select * from dwr_event.dwd_event_incident_records_f tab1 where not exists (select 1 from dwr_event.dwd_event_incident_records_f where incident_code=tab1.incident_code and dw_batch_number>tab1.dw_batch_number) ) inc --关联空间维表 left join dwr_dim.dim_space_record_d spa on inc.space_code = spa.id where type in ('SafetyAlarm','FireAlarm') and incident_code not in (select incident_code from dwr_event.dwd_event_incident_records_f where 1=1 ) group by inc.alarm_def_category_type_id,inc.occur_date,type_cn,type,inc.dw_batch_number,park_code;
  • [技术干货] 智慧园区数据平台DO GaussDB 100和GaussDB 200的差异点(上)
    Cube环境使用的是GaussDB 100数据库,公有云环境使用的是GaussDB 200数据库。两者脚本开发时差异点如下:大小写区分GaussDB 100数据库:严格区分大小写,不加引号默认是大写。加引号后,引号里面的内容格式不变。GaussDB 200数据库:表名、字段无论加不加引号,都是创建的小写的表名和字段名。所以GaussDB 100数据库脚本开发规范:在GaussDB 100数据库中,建表语句ddl的表名、schema名和字段名不要加引号。表1 数据库ddl示例GaussDB 100数据库ddl示例GaussDB 200数据库ddl示例CREATE TABLE IF NOT EXISTS dm_asset.dm_asset_dept_distribution_f ( id serial, dw_creation_by character varying(100), dw_creation_date timestamp without time zone, dw_last_update_by character varying(100), dw_last_update_date timestamp without time zone, dw_batch_number bigint ) WITH (orientation=row, compression=no) DISTRIBUTE BY HASH (id); COMMENT ON TABLE dm_asset.dm_asset_dept_distribution_f IS '部门资产归总表(Table of department assets summarized)'; COMMENT ON COLUMN dm_asset.dm_asset_dept_distribution_f.id IS 'id'; COMMENT ON COLUMN dm_asset.dm_asset_dept_distribution_f.dw_creation_by IS '数据创建者(The creator)'; COMMENT ON COLUMN dm_asset.dm_asset_dept_distribution_f.dw_creation_date IS '数据创建时间(Creation date)'; COMMENT ON COLUMN dm_asset.dm_asset_dept_distribution_f.dw_last_update_by IS '数据最后更新者(Last updater)'; COMMENT ON COLUMN dm_asset.dm_asset_dept_distribution_f.dw_last_update_date IS '最后更新时间(Last update date)'; COMMENT ON COLUMN dm_asset.dm_asset_dept_distribution_f.dw_batch_number IS '批次号(Data batch number)';CREATE TABLE IF NOT EXISTS "dm_asset"."dm_asset_dept_distribution_f" ( id serial, dw_creation_by character varying(100), dw_creation_date timestamp without time zone, dw_last_update_by character varying(100), dw_last_update_date timestamp without time zone, dw_batch_number bigint ) WITH (orientation=row, compression=no) DISTRIBUTE BY HASH (id); COMMENT ON TABLE "dm_asset"."dm_asset_dept_distribution_f" IS '部门资产归总表(Table of department assets summarized)'; COMMENT ON COLUMN "dm_asset"."dm_asset_dept_distribution_f".id IS 'id'; COMMENT ON COLUMN "dm_asset"."dm_asset_dept_distribution_f".dw_creation_by IS '数据创建者(The creator)'; COMMENT ON COLUMN "dm_asset"."dm_asset_dept_distribution_f".dw_creation_date IS '数据创建时间(Creation date)'; COMMENT ON COLUMN "dm_asset"."dm_asset_dept_distribution_f".dw_last_update_by IS '数据最后更新者(Last updater)'; COMMENT ON COLUMN "dm_asset"."dm_asset_dept_distribution_f".dw_last_update_date IS '最后更新时间(Last update date)'; COMMENT ON COLUMN "dm_asset"."dm_asset_dept_distribution_f".dw_batch_number IS '批次号(Data batch number)';在GaussDB 100数据库中,DGC的脚本SQL涉及到的表名、字段名不需要加引号。表2 DGC的SQL示例GaussDB 100数据库DGC的SQL示例GaussDB 200数据库DGC的SQL示例--查询表 select * from dm_asset.dm_asset_dept_distribution_f; --资产基本信息视图 create or replace view dm_asset.logic_depts_view as( ... ); --删除视图 drop view dm_asset.logic_depts_view;--查询表 select * from dm_asset."dm_asset_dept_distribution_f"; --资产基本信息视图 create or replace view dm_asset."logic_depts_view" as( ... ); --删除视图 drop view dm_asset."logic_depts_view";在GaussDB 100数据库中,自定义函数或者方法里函数名称、方法名称和涉及到的表名等(例如:end;$$language plpgsql;),需要写成没有引号的。表3 自定义函数或者方法示例GaussDB 100数据库自定义函数或者方法示例GaussDB 200数据库自定义函数或者方法示例--创建自定义函数 create or replace function dm_asset.func_find_dept(current_id text) returns text[][] as $$ declare cursor_id text; ... begin select org_id,org_name,parent_code from dwr_dim.dim_org_base_d where org_id = current_id into cursor_id; ... end; $$ language plpgsql--创建自定义函数 create or replace function dm_asset."func_find_dept"(current_id text) returns text[][] as $$ declare cursor_id text; ... begin select org_id,org_name,parent_code from dwr_dim."dim_org_base_d" where org_id = current_id into cursor_id; ... end; $$ language 'plpgsql'在GaussDB 100数据库中,由于DWS默认是小写,所以在ROMA里面的API接口返回必须进行重命名,使得从GaussDB 100和DWS取出的数据字段是一致的。表4 ROMA接口的SQL示例GaussDB 100数据库ROMA接口的SQL示例GaussDB 200数据库ROMA接口的SQL示例SELECT TOP_TYPE_ID as "top_type_id", TOP_TYPE_CN as "top_type_name", ASSET_COUNT as "asset_count", ASSET_COST as "asset_cost", ... FROM dm_asset.dm_asset_distribution_f WHERE summary_code = '2';SELECT TOP_TYPE_ID, TOP_TYPE_CN, ASSET_COUNT, ASSET_COST, ... FROM dm_asset."dm_asset_distribution_f" WHERE summary_code = '2';
  • [最佳实践] 创建Flink OpenSource作业从Postgres CDC源表读取数据写入到DWS
    场景描述CDC是变更数据捕获(Change Data Capture)技术的缩写,它可以将源数据库的增量变动记录,同步到一个或多个数据目的中。CDC在数据同步过程中,还可以对数据进行一定的处理,例如分组(GROUP BY)、多表的关联(JOIN)等。本示例通过创建Postgres CDC源表来监控Postgres的数据变化,并将变化的数据信息插入到DWS数据库中。前提条件已创建RDS Postgres实例,具体步骤可参考:RDS PostgreSQL快速入门。本示例创建的RDS Postgres数据库版本选择为:11。说明:创建的RDS Postgres数据库版本不能低于11。已创建DWS实例,具体创建DWS集群的操作可以参考创建DWS集群。本示例创建的DWS集群版本为:8.1.1.205。整体作业开发流程整体作业开发流程参考图1。图1 作业开发流程步骤1:创建队列:创建DLI作业运行的队列。步骤2:创建RDS Postgres数据库:创建RDS Postgres的数据库和表。步骤3:创建DWS数据库和表:创建用于接收数据的DWS数据库和表。步骤4:创建增强型跨源连接:DLI上创建连接RDS和DWS的跨源连接,打通网络。步骤5:运行作业:DLI上创建和运行Flink OpenSource作业。步骤6:发送数据和查询结果:RDS Postgres的表上插入数据,在DWS上查看运行结果。步骤1:创建队列登录DLI管理控制台,在左侧导航栏单击“资源管理 > 队列管理”,可进入队列管理页面。在队列管理界面,单击界面右上角的“购买队列”。在“购买队列”界面,填写具体的队列配置参数,具体参数填写参考如下。计费模式:选择“包年/包月”或“按需计费”。本示例选择“按需计费”。区域和项目:保持默认值即可。名称:填写具体的队列名称。说明:新建的队列名称,名称只能包含数字、英文字母和下划线,但不能是纯数字,且不能以下划线开头。长度限制:1~128个字符。队列名称不区分大小写,系统会自动转换为小写。类型:队列类型选择“通用队列”。“按需计费”时需要勾选“专属资源模式”。AZ策略、CPU架构、规格:保持默认即可。企业项目:当前选择为“default”。高级选项:选择“自定义”。网段:配置队列网段。例如,当前配置为10.0.0.0/16。注意:队列的网段不能和DMS Kafka、RDS MySQL实例的子网网段有重合,否则后续创建跨源连接会失败。其他参数根据需要选择和配置。图2 创建队列参数配置完成后,单击“立即购买”,确认配置信息无误后,单击“提交”完成队列创建。步骤2:创建RDS Postgres数据库登录RDS管理控制台,在“实例管理”界面,选择已创建的RDS Postgres实例,选择操作列的“更多 > 登录”,进入数据管理服务实例登录界面。输入实例登录的用户名和密码。单击“登录”,即可进入RDS Postgres数据库并进行管理。在数据库实例界面,单击“新建数据库”,数据库名定义为:testrdsdb,字符集保持默认即可。在testrdsdb数据库下,单击“新建Schema”,Schema名称输入为:test。在test的Schema所在行,单击“操作”列的“打开Schema”。单击“SQL查询”,输入以下创建表语句,创建RDS Postgres表。create table test.cdc_order( order_id VARCHAR, order_channel VARCHAR, order_time VARCHAR, pay_amount FLOAT8, real_pay FLOAT8, pay_time VARCHAR, user_id VARCHAR, user_name VARCHAR, area_id VARCHAR, primary key(order_id));在Postgre中执行下列SQL语句。ALTER TABLE test.cdc_order REPLICA IDENTITY FULL;步骤3:创建DWS数据库和表参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“gaussdb”:gsql -d gaussdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -rgaussdb:DWS集群默认数据库。DWS集群连接地址:请参见获取集群连接地址进行获取。如果通过公网地址连接,请指定为集群“公网访问地址”或“公网访问域名”,如果通过内网地址连接,请指定为集群“内网访问地址”或“内网访问域名”。如果通过弹性负载均衡连接,请指定为“弹性负载均衡地址”。dbadmin:创建集群时设置的默认管理员用户名。-W:默认管理员用户的密码。在命令行窗口输入以下命令创建数据库“testdwsdb”。CREATE DATABASE testdwsdb;执行以下命令,退出gaussdb数据库,连接新创建的数据库“testdwsdb”。\q gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r执行以下命令创建表。create schema test; set current_schema= test; drop table if exists dws_order; CREATE TABLE dws_order ( order_id VARCHAR, order_channel VARCHAR, order_time VARCHAR, pay_amount FLOAT8, real_pay FLOAT8, pay_time VARCHAR, user_id VARCHAR, user_name VARCHAR, area_id VARCHAR );步骤4:创建增强型跨源连接创建DLI连接RDS的增强型跨源连接在RDS管理控制台,选择“实例管理”,单击对应的RDS实例名称,进入到RDS的基本信息页面。在“基本信息”的“连接信息”中获取该实例的“内网地址”、“数据库端口”、“虚拟私有云”和“子网”信息,方便后续操作步骤使用。单击“连接信息”中的安全组名称,在“入方向规则”中添加放通队列网段的规则。例如,本示例队列网段为“10.0.0.0/16”,则规则添加为:优先级选为:1,策略选为:允许,协议选择:TCP,端口值不填,类型:IPV4,源地址为:10.0.0.0/16,单击“确定”完成安全组规则添加。登录DLI管理控制台,在左侧导航栏单击“跨源管理”,在跨源管理界面,单击“增强型跨源”,单击“创建”。在增强型跨源创建界面,配置具体的跨源连接参数。具体参考如下。连接名称:设置具体的增强型跨源名称。本示例输入为:dli_rds。弹性资源池:选择步骤1:创建队列中已经创建的队列。虚拟私有云:选择RDS的虚拟私有云。子网:选择RDS的子网。其他参数可以根据需要选择配置。参数配置完成后,单击“确定”完成增强型跨源配置。单击创建的跨源连接名称,查看跨源连接的连接状态,等待连接状态为:“已激活”后可以进行后续步骤。单击“队列管理”,选择操作的队列,本示例为步骤1:创建队列中创建的队列,在操作列,单击“更多 > 测试地址连通性”。在“测试连通性”界面,根据2中获取的RDS连接信息,地址栏输入“RDS内网地址:RDS数据库端口”,单击“测试”测试DLI到RDS网络是否可达。创建DLI连接DWS的增强型跨源连接在DWS管理控制台,选择“集群管理”,单击已创建的DWS集群名称,进入到DWS的基本信息页面。在“基本信息”的“数据库属性”中获取该实例的“内网IP”、“端口”,“基本信息”页面的“网络”中获取“虚拟私有云”和“子网”信息,方便后续操作步骤使用。单击“连接信息”中的安全组名称,在“入方向规则”中添加放通队列网段的规则。例如,本示例队列网段为“10.0.0.0/16”,则规则添加为:优先级选为:1,策略选为:允许,协议选择:TCP,端口值不填,类型:IPV4,源地址为:10.0.0.0/16,单击“确定”完成安全组规则添加。登录DLI管理控制台,在左侧导航栏单击“跨源管理”,在跨源管理界面,单击“增强型跨源”,单击“创建”。说明:本示例默认RDS和DWS实例分别在两个VPC和子网下,所以要分别创建增强型跨源连接打通网络。如果RDS和DWS实例属于同一VPC和子网下,则创建增强型跨源一次即可,4和5不需要再执行。在增强型跨源创建界面,配置具体的跨源连接参数。具体参考如下。连接名称:设置具体的增强型跨源名称。本示例输入为:dli_dws。弹性资源池:选择步骤1:创建队列中已经创建的队列。虚拟私有云:选择DWS的虚拟私有云。子网:选择DWS的子网。其他参数可以根据需要选择配置。参数配置完成后,单击“确定”完成增强型跨源配置。单击创建的跨源连接名称,查看跨源连接的连接状态,等待连接状态为:“已激活”后可以进行后续步骤。单击“队列管理”,选择操作的队列,本示例为步骤1:创建队列中创建的队列,在操作列,单击“更多 > 测试地址连通性”。在“测试连通性”界面,根据2中获取的DWS连接信息,地址栏输入“DWS内网IP:DWS端口”,单击“测试”测试DLI到DWS网络是否可达。步骤5:运行作业在DLI管理控制台,单击“作业管理 > Flink作业”,在Flink作业管理界面,单击“创建作业”。在创建队列界面,类型选择“Flink OpenSource SQL”,名称填写为:FlinkCDCPostgreDWS。单击“确定”,跳转到Flink作业编辑界面。在Flink OpenSource SQL作业编辑界面,配置如下参数。所属队列:选择步骤1:创建队列中创建的队列。Flink版本:选择1.12。保存作业日志:勾选。OBS桶:选择保存作业日志的OBS桶,根据提示进行OBS桶权限授权。开启Checkpoint:勾选。Flink作业编辑框中输入具体的作业SQL,本示例作业参考如下。SQL中加粗的参数需要根据实际情况修改。说明:本示例使用的Flink版本为1.12,故Flink OpenSource SQL语法也是1.12。本示例数据源是Kafka,写入结果数据到Elasticsearch,故请参考Flink OpenSource SQL 1.12创建Postgres CDC源表和Flink OpenSource SQL 1.12创建DWS结果表。create table PostgreCdcSource( order_id string, order_channel string, order_time string, pay_amount double, real_pay double, pay_time string, user_id string, user_name string, area_id STRING, primary key (order_id) not enforced ) with ( 'connector' = 'postgres-cdc', 'hostname' = '192.168.15.153',--IP替换为RDS Postgres的实例IP 'port' = '5432',--端口替换为RDS Postgres的实例端口 'username' = 'xxxxx',--RDS Postgres实例的数据库用户名 'password' = 'xxxxx',-RDS Postgres实例的数据库用户密码 'database-name' = 'testrdsdb',--RDS Postgres实例的数据库名 'schema-name' = 'test',--RDS Postgres数据库下的schema 'table-name' = 'cdc_order'--RDS Postgres数据库下的表名 ); create table dwsSink( order_id string, order_channel string, order_time string, pay_amount double, real_pay double, pay_time string, user_id string, user_name string, area_id STRING, primary key(order_id) not enforced ) with ( 'connector' = 'gaussdb', 'driver' = 'com.huawei.gauss200.jdbc.Driver', 'url' = 'jdbc:gaussdb://192.168.168.16:8000/testdwsdb', ---192.168.168.16:8000替换为DWS的内网IP和端口,testdwsdb为创建的DWS数据库名 'table-name' = 'test\".\"dws_order', ---test为创建的DWS表的schema,dws_order为对应的DWS表名 'username' = 'xxxxx',--替换为DWS实例的用户名 'password' = 'xxxxx',--替换为DWS实例的用户密码 'write.mode' = 'insert' ); insert into dwsSink select * from PostgreCdcSource where pay_amount > 100;单击“语义校验”确保SQL语义校验成功。单击“保存”,保存作业。单击“启动”,启动作业,确认作业参数信息,单击“立即启动”开始执行作业。等待作业运行状态变为“运行中”。步骤6:发送数据和查询结果登录RDS管理控制台,在“实例管理”界面,选择已创建的RDS Postgres实例,选择操作列的“更多 > 登录”,进入数据管理服务实例登录界面。输入实例登录的用户名和密码。单击“登录”,即可进入RDS Postgres数据库并进行管理。在已创建的数据库的操作列,单击“SQL查询”,输入以下创建表语句,插入测试数据。insert into test.cdc_order values ('202103241000000001','webShop','2021-03-24 10:00:00','50.00','100.00','2021-03-24 10:02:03','0001','Alice','330106'), ('202103251606060001','appShop','2021-03-24 12:06:06','200.00','180.00','2021-03-24 16:10:06','0002','Jason','330106'), ('202103261000000001','webShop','2021-03-24 14:03:00','300.00','100.00','2021-03-24 10:02:03','0003','Lily','330106'), ('202103271606060001','appShop','2021-03-24 16:36:06','99.00','150.00','2021-03-24 16:10:06','0001','Henry','330106');参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“testdwsdb”:gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r执行以下语句,查询DWS的表数据。select * from test.dws_order;查询结果参考如下:order_channel order_channel order_time pay_amount real_pay pay_time user_id user_name area_id 202103251606060001 appShop 2021-03-24 12:06:06 200.0 180.0 2021-03-24 16:10:06 0002 Jason 330106 202103261000000001 webShop 2021-03-24 14:03:00 300.0 100.0 2021-03-24 10:02:03 0003 Lily 330106
  • [最佳实践] 创建Flink OpenSource作业从MySQL CDC源表读取数据写入到DWS
    场景描述CDC是变更数据捕获(Change Data Capture)技术的缩写,它可以将源数据库的增量变动记录,同步到一个或多个数据目的中。CDC在数据同步过程中,还可以对数据进行一定的处理,例如分组(GROUP BY)、多表的关联(JOIN)等。本示例通过创建MySQL CDC源表来监控MySQL的数据变化,并将变化的数据信息插入到DWS数据库中。前提条件已创建RDS MySQL实例,具体步骤可参考:RDS MySQL快速入门。本示例创建的RDS MySQL数据库版本选择为:8.0。已创建DWS实例,具体创建DWS集群的操作可以参考创建DWS集群。本示例创建的DWS集群版本为:8.1.1.205。整体作业开发流程整体作业开发流程参考图1。图1 作业开发流程步骤1:创建队列:创建DLI作业运行的队列。步骤2:创建RDS MySQL数据库和表:创建RDS MySQL的数据库和表。步骤3:创建DWS数据库和表:创建用于接收数据的DWS数据库和表。步骤4:创建增强型跨源连接:DLI上创建连接RDS和DWS的跨源连接,打通网络。步骤5:运行作业:DLI上创建和运行Flink OpenSource作业。步骤6:发送数据和查询结果:RDS MySQL的表上插入数据,在DWS上查看运行结果。步骤1:创建队列登录DLI管理控制台,在左侧导航栏单击“资源管理 > 队列管理”,可进入队列管理页面。在队列管理界面,单击界面右上角的“购买队列”。在“购买队列”界面,填写具体的队列配置参数,具体参数填写参考如下。计费模式:选择“包年/包月”或“按需计费”。本示例选择“按需计费”。区域和项目:保持默认值即可。名称:填写具体的队列名称。说明:新建的队列名称,名称只能包含数字、英文字母和下划线,但不能是纯数字,且不能以下划线开头。长度限制:1~128个字符。队列名称不区分大小写,系统会自动转换为小写。类型:队列类型选择“通用队列”。“按需计费”时需要勾选“专属资源模式”。AZ策略、CPU架构、规格:保持默认即可。企业项目:当前选择为“default”。高级选项:选择“自定义”。网段:配置队列网段。例如,当前配置为10.0.0.0/16。注意:队列的网段不能和DMS Kafka、RDS MySQL实例的子网网段有重合,否则后续创建跨源连接会失败。其他参数根据需要选择和配置。图2 创建队列参数配置完成后,单击“立即购买”,确认配置信息无误后,单击“提交”完成队列创建。步骤2:创建RDS MySQL数据库和表登录RDS管理控制台,在“实例管理”界面,选择已创建的RDS MySQL实例,选择操作列的“更多 > 登录”,进入数据管理服务实例登录界面。输入实例登录的用户名和密码。单击“登录”,即可进入RDS MySQL数据库并进行管理。在数据库实例界面,单击“新建数据库”,数据库名定义为:testrdsdb,字符集保持默认即可。在已创建的数据库的操作列,单击“SQL查询”,输入以下创建表语句,创建RDS MySQL表。CREATE TABLE mysqlcdc ( `order_id` VARCHAR(64) NOT NULL, `order_channel` VARCHAR(32) NOT NULL, `order_time` VARCHAR(32), `pay_amount` DOUBLE, `real_pay` DOUBLE, `pay_time` VARCHAR(32), `user_id` VARCHAR(32), `user_name` VARCHAR(32), `area_id` VARCHAR(32) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4;步骤3:创建DWS数据库和表参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“gaussdb”:gsql -d gaussdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -rgaussdb:DWS集群默认数据库。DWS集群连接地址:请参见获取集群连接地址进行获取。如果通过公网地址连接,请指定为集群“公网访问地址”或“公网访问域名”,如果通过内网地址连接,请指定为集群“内网访问地址”或“内网访问域名”。如果通过弹性负载均衡连接,请指定为“弹性负载均衡地址”。dbadmin:创建集群时设置的默认管理员用户名。-W:默认管理员用户的密码。在命令行窗口输入以下命令创建数据库“testdwsdb”。CREATE DATABASE testdwsdb;执行以下命令,退出gaussdb数据库,连接新创建的数据库“testdwsdb”。\q gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r执行以下命令创建表。create schema test; set current_schema= test; drop table if exists dwsresult; CREATE TABLE dwsresult ( car_id VARCHAR, car_owner VARCHAR, car_age INTEGER , average_speed FLOAT8, total_miles FLOAT8 );步骤4:创建增强型跨源连接创建DLI连接RDS的增强型跨源连接在RDS管理控制台,选择“实例管理”,单击对应的RDS实例名称,进入到RDS的基本信息页面。在“基本信息”的“连接信息”中获取该实例的“内网地址”、“数据库端口”、“虚拟私有云”和“子网”信息,方便后续操作步骤使用。单击“连接信息”中的安全组名称,在“入方向规则”中添加放通队列网段的规则。例如,本示例队列网段为“10.0.0.0/16”,则规则添加为:优先级选为:1,策略选为:允许,协议选择:TCP,端口值不填,类型:IPV4,源地址为:10.0.0.0/16,单击“确定”完成安全组规则添加。登录DLI管理控制台,在左侧导航栏单击“跨源管理”,在跨源管理界面,单击“增强型跨源”,单击“创建”。在增强型跨源创建界面,配置具体的跨源连接参数。具体参考如下。连接名称:设置具体的增强型跨源名称。本示例输入为:dli_rds。弹性资源池:选择步骤1:创建队列中已经创建的队列。虚拟私有云:选择RDS的虚拟私有云。子网:选择RDS的子网。其他参数可以根据需要选择配置。参数配置完成后,单击“确定”完成增强型跨源配置。单击创建的跨源连接名称,查看跨源连接的连接状态,等待连接状态为:“已激活”后可以进行后续步骤。单击“队列管理”,选择操作的队列,本示例为步骤1:创建队列中创建的队列,在操作列,单击“更多 > 测试地址连通性”。在“测试连通性”界面,根据2中获取的RDS连接信息,地址栏输入“RDS内网地址:RDS数据库端口”,单击“测试”测试DLI到RDS网络是否可达。创建DLI连接DWS的增强型跨源连接在DWS管理控制台,选择“集群管理”,单击已创建的DWS集群名称,进入到DWS的基本信息页面。在“基本信息”的“数据库属性”中获取该实例的“内网IP”、“端口”,“基本信息”页面的“网络”中获取“虚拟私有云”和“子网”信息,方便后续操作步骤使用。单击“连接信息”中的安全组名称,在“入方向规则”中添加放通队列网段的规则。例如,本示例队列网段为“10.0.0.0/16”,则规则添加为:优先级选为:1,策略选为:允许,协议选择:TCP,端口值不填,类型:IPV4,源地址为:10.0.0.0/16,单击“确定”完成安全组规则添加。登录DLI管理控制台,在左侧导航栏单击“跨源管理”,在跨源管理界面,单击“增强型跨源”,单击“创建”。说明:本示例默认RDS和DWS实例分别在两个VPC和子网下,所以要分别创建增强型跨源连接打通网络。如果RDS和DWS实例属于同一VPC和子网下,则创建增强型跨源一次即可,4和5不需要再执行。在增强型跨源创建界面,配置具体的跨源连接参数。具体参考如下。连接名称:设置具体的增强型跨源名称。本示例输入为:dli_dws。弹性资源池:选择步骤1:创建队列中已经创建的队列。虚拟私有云:选择DWS的虚拟私有云。子网:选择DWS的子网。其他参数可以根据需要选择配置。参数配置完成后,单击“确定”完成增强型跨源配置。单击创建的跨源连接名称,查看跨源连接的连接状态,等待连接状态为:“已激活”后可以进行后续步骤。单击“队列管理”,选择操作的队列,本示例为步骤1:创建队列中创建的队列,在操作列,单击“更多 > 测试地址连通性”。在“测试连通性”界面,根据2中获取的DWS连接信息,地址栏输入“DWS内网IP:DWS端口”,单击“测试”测试DLI到DWS网络是否可达。步骤5:运行作业在DLI管理控制台,单击“作业管理 > Flink作业”,在Flink作业管理界面,单击“创建作业”。在创建队列界面,类型选择“Flink OpenSource SQL”,名称填写为:FlinkCDCMySQLDWS。单击“确定”,跳转到Flink作业编辑界面。在Flink OpenSource SQL作业编辑界面,配置如下参数。所属队列:选择步骤1:创建队列中创建的队列。Flink版本:选择1.12。保存作业日志:勾选。OBS桶:选择保存作业日志的OBS桶,根据提示进行OBS桶权限授权。开启Checkpoint:勾选。Flink作业编辑框中输入具体的作业SQL,本示例作业参考如下。SQL中加粗的参数需要根据实际情况修改。说明:本示例使用的Flink版本为1.12,故Flink OpenSource SQL语法也是1.12。本示例数据源是Kafka,写入结果数据到Elasticsearch,故请参考Flink OpenSource SQL 1.12创建MySQL CDC源表和Flink OpenSource SQL 1.12创建DWS结果表。create table mysqlCdcSource( order_id string, order_channel string, order_time string, pay_amount double, real_pay double, pay_time string, user_id string, user_name string, area_id STRING ) with ( 'connector' = 'mysql-cdc', 'hostname' = '192.168.12.148',--IP替换为RDS MySQL的实例IP 'port' = '3306',--端口替换为RDS MySQL的实例端口 'username' = 'xxx',--RDS MySQL实例的数据库用户名 'password' = 'xxx',--RDS MySQL实例的数据库用户密码 'database-name' = 'testrdsdb',--RDS MySQL实例的数据库名 'table-name' = 'mysqlcdc'--RDS MySQL实例的数据库下的表名 ); create table dwsSink( order_channel string, pay_amount double, real_pay double, primary key(order_channel) not enforced ) with ( 'connector' = 'gaussdb', 'driver' = 'com.huawei.gauss200.jdbc.Driver', 'url' = 'jdbc:gaussdb://192.168.168.16:8000/testdwsdb', ---192.168.168.16:8000替换为DWS的内网IP和端口,testdwsdb为创建的DWS数据库名 'table-name' = 'test\".\"dwsresult', ---test为创建的DWS表的schema,dwsresult为对应的DWS表名 'username' = 'xxx',--替换为DWS实例的用户名 'password' = 'xxx',--替换为DWS实例的用户密码 'write.mode' = 'insert' ); insert into dwsSink select order_channel, sum(pay_amount),sum(real_pay) from mysqlCdcSource group by order_channel;单击“语义校验”确保SQL语义校验成功。单击“保存”,保存作业。单击“启动”,启动作业,确认作业参数信息,单击“立即启动”开始执行作业。等待作业运行状态变为“运行中”。步骤6:发送数据和查询结果登录RDS管理控制台,在“实例管理”界面,选择已创建的RDS MySQL实例,选择操作列的“更多 > 登录”,进入数据管理服务实例登录界面。输入实例登录的用户名和密码。单击“登录”,即可进入RDS MySQL数据库并进行管理。在已创建的数据库的操作列,单击“SQL查询”,输入以下创建表语句,插入测试数据。insert into mysqlcdc values ('202103241000000001','webShop','2021-03-24 10:00:00','100.00','100.00','2021-03-24 10:02:03','0001','Alice','330106'), ('202103241206060001','appShop','2021-03-24 12:06:06','200.00','180.00','2021-03-24 16:10:06','0002','Jason','330106'), ('202103241403000001','webShop','2021-03-24 14:03:00','300.00','100.00','2021-03-24 10:02:03','0003','Lily','330106'), ('202103241636060001','appShop','2021-03-24 16:36:06','200.00','150.00','2021-03-24 16:10:06','0001','Henry','330106');参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“testdwsdb”:gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r执行以下命令,查询DWS的表数据。select * from test.dwsresult;查询结果参考如下:order_channel pay_amount real_pay appShop 400.0 330.0 webShop 400.0 200.0
  • [最佳实践] 创建Flink OpenSource作业从Kafka读取数据写入到DWS
    场景描述该场景为对汽车驾驶的实时数据信息进行分析,将满足特定条件的数据结果进行汇总。数据的输入源为Kafka,结果输出到DWS中。例如,如下样例输入数据:{"car_id":"3027", "car_owner":"lilei", "car_age":"7", "average_speed":"76", "total_miles":"15000"} {"car_id":"3028", "car_owner":"hanmeimei", "car_age":"6", "average_speed":"92", "total_miles":"17000"} {"car_id":"3029", "car_owner":"zhangsan", "car_age":"10", "average_speed":"81", "total_miles":"230000"}预期输出:average_speed <= 90 和 total_miles <= 200000的车辆,即:{"car_id":"3027", "car_owner":"lilei", "car_age":"7", "average_speed":"76", "total_miles":"15000"}前提条件已创建DMS Kafka实例,具体步骤可参考:创建Kafka实例。注意:创建DMS Kafka实例时,不能开启Kafka SASL_SSL。已创建DWS实例,具体创建DWS集群的操作可以参考创建DWS集群。本示例创建的DWS集群版本为:8.1.1.205。整体作业开发流程整体作业开发流程参考图1。图1 作业开发流程步骤1:创建队列:创建DLI作业运行的队列。步骤2:创建Kafka的Topic:创建Kafka生产消费数据的Topic。步骤3:创建DWS数据库和表:创建DWS数据库和表信息。步骤4:创建增强型跨源连接:DLI上创建连接Kafka和DWS的跨源连接,打通网络。步骤5:运行作业:DLI上创建和运行Flink OpenSource作业。步骤6:发送数据和查询结果:Kafka上发送流数据,在RDS上查看运行结果。步骤1:创建队列登录DLI管理控制台,在左侧导航栏单击“资源管理 > 队列管理”,可进入队列管理页面。在队列管理界面,单击界面右上角的“购买队列”。在“购买队列”界面,填写具体的队列配置参数,具体参数填写参考如下。计费模式:选择“包年/包月”或“按需计费”。本示例选择“按需计费”。区域和项目:保持默认值即可。名称:填写具体的队列名称。说明:新建的队列名称,名称只能包含数字、英文字母和下划线,但不能是纯数字,且不能以下划线开头。长度限制:1~128个字符。队列名称不区分大小写,系统会自动转换为小写。类型:队列类型选择“通用队列”。“按需计费”时需要勾选“专属资源模式”。AZ策略、CPU架构、规格:保持默认即可。企业项目:当前选择为“default”。高级选项:选择“自定义”。网段:配置队列网段。例如,当前配置为10.0.0.0/16。注意:队列的网段不能和DMS Kafka、RDS MySQL实例的子网网段有重合,否则后续创建跨源连接会失败。其他参数根据需要选择和配置。图2 创建队列参数配置完成后,单击“立即购买”,确认配置信息无误后,单击“提交”完成队列创建。步骤2:创建Kafka的Topic在Kafka管理控制台,选择“Kafka专享版”,单击对应的Kafka名称,进入到Kafka的基本信息页面。单击“Topic管理 > 创建Topic”,创建一个Topic。Topic配置参数如下:Topic名称。本示例输入为:testkafkatopic。分区数:1。副本数:1其他参数保持默认即可。步骤3:创建DWS数据库和表参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“gaussdb”:gsql -d gaussdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -rgaussdb:DWS集群默认数据库。DWS集群连接地址:请参见获取集群连接地址进行获取。如果通过公网地址连接,请指定为集群“公网访问地址”或“公网访问域名”,如果通过内网地址连接,请指定为集群“内网访问地址”或“内网访问域名”。如果通过弹性负载均衡连接,请指定为“弹性负载均衡地址”。dbadmin:创建集群时设置的默认管理员用户名。-W:默认管理员用户的密码。在命令行窗口输入以下命令创建数据库“testdwsdb”。CREATE DATABASE testdwsdb;执行以下命令,退出gaussdb数据库,连接新创建的数据库“testdwsdb”。\q gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r执行以下命令创建表。create schema test; set current_schema= test; drop table if exists qualified_cars; CREATE TABLE qualified_cars ( car_id VARCHAR, car_owner VARCHAR, car_age INTEGER , average_speed FLOAT8, total_miles FLOAT8 );步骤4:创建增强型跨源连接创建DLI连接Kafka的增强型跨源连接在Kafka管理控制台,选择“Kafka专享版”,单击对应的Kafka名称,进入到Kafka的基本信息页面。在“连接信息”中获取该Kafka的“内网连接地址”,在“基本信息”的“网络”中获取获取该实例的“虚拟私有云”和“子网”信息,方便后续操作步骤使用。单击“网络”中的安全组名称,在“入方向规则”中添加放通队列网段的规则。例如,本示例队列网段为“10.0.0.0/16”,则规则添加为:优先级选为:1,策略选为:允许,协议选择:TCP,端口值不填,类型:IPV4,源地址为:10.0.0.0/16,单击“确定”完成安全组规则添加。登录DLI管理控制台,在左侧导航栏单击“跨源管理”,在跨源管理界面,单击“增强型跨源”,单击“创建”。在增强型跨源创建界面,配置具体的跨源连接参数。具体参考如下。连接名称:设置具体的增强型跨源名称。本示例输入为:dli_kafka。弹性资源池:选择步骤1:创建队列中已经创建的队列名。虚拟私有云:选择Kafka的虚拟私有云。子网:选择Kafka的子网。其他参数可以根据需要选择配置。参数配置完成后,单击“确定”完成增强型跨源配置。单击创建的跨源连接名称,查看跨源连接的连接状态,等待连接状态为:“已激活”后可以进行后续步骤。单击“队列管理”,选择操作的队列,本示例为步骤1:创建队列中创建的队列,在操作列,单击“更多 > 测试地址连通性”。在“测试连通性”界面,根据2中获取的Kafka连接信息,地址栏输入“Kafka内网地址:Kafka数据库端口”,单击“测试”测试DLI到Kafka网络是否可达。创建DLI连接DWS的增强型跨源连接在DWS管理控制台,选择“集群管理”,单击已创建的DWS集群名称,进入到DWS的基本信息页面。在“基本信息”的“数据库属性”中获取该实例的“内网IP”、“端口”,“基本信息”页面的“网络”中获取“虚拟私有云”和“子网”信息,方便后续操作步骤使用。单击“连接信息”中的安全组名称,在“入方向规则”中添加放通队列网段的规则。例如,本示例队列网段为“10.0.0.0/16”,则规则添加为:优先级选为:1,策略选为:允许,协议选择:TCP,端口值不填,类型:IPV4,源地址为:10.0.0.0/16,单击“确定”完成安全组规则添加。登录DLI管理控制台,在左侧导航栏单击“跨源管理”,在跨源管理界面,单击“增强型跨源”,单击“创建”。说明:本示例默认Kafka和DWS实例分别在两个VPC和子网下,所以要分别创建增强型跨源连接打通网络。如果Kafka和DWS实例属于同一VPC和子网下,则创建增强型跨源一次即可,4和5不需要再执行。在增强型跨源创建界面,配置具体的跨源连接参数。具体参考如下。连接名称:设置具体的增强型跨源名称。本示例输入为:dli_dws。弹性资源池:选择步骤1:创建队列中已经创建的队列名。虚拟私有云:选择DWS的虚拟私有云。子网:选择DWS的子网。其他参数可以根据需要选择配置。参数配置完成后,单击“确定”完成增强型跨源配置。单击创建的跨源连接名称,查看跨源连接的连接状态,等待连接状态为:“已激活”后可以进行后续步骤。单击“队列管理”,选择操作的队列,本示例为步骤1:创建队列中创建的队列,在操作列,单击“更多 > 测试地址连通性”。在“测试连通性”界面,根据2中获取的DWS连接信息,地址栏输入“DWS内网IP:DWS端口”,单击“测试”测试DLI到DWS网络是否可达。步骤5:运行作业在DLI管理控制台,单击“作业管理 > Flink作业”,在Flink作业管理界面,单击“创建作业”。在创建队列界面,类型选择“Flink OpenSource SQL”,名称填写为:FlinkKafkaDWS。单击“确定”,跳转到Flink作业编辑界面。在Flink OpenSource SQL作业编辑界面,配置如下参数。所属队列:选择步骤1:创建队列中创建的队列。Flink版本:选择1.12。保存作业日志:勾选。OBS桶:选择保存作业日志的OBS桶,根据提示进行OBS桶权限授权。开启Checkpoint:勾选。Flink作业编辑框中输入具体的作业SQL,本示例作业参考如下。SQL中加粗的参数需要根据实际情况修改。说明:本示例使用的Flink版本为1.12,故Flink OpenSource SQL语法也是1.12。本示例数据源是Kafka,写入结果数据到DWS,故请参考Flink OpenSource SQL 1.12创建Kafka源表和Flink OpenSource SQL 1.12创建DWS结果表(RDS连接)。create table car_infos( car_id STRING, car_owner STRING, car_age INT, average_speed DOUBLE, total_miles DOUBLE ) with ( "connector" = "kafka", "properties.bootstrap.servers" = "10.128.0.120:9092,10.128.0.89:9092,10.128.0.83:9092",--替换为kafka的内网连接地址和端口 "properties.group.id" = "click", "topic" = "testkafkatopic",--创建的Kafka的Topic "format" = "json", "scan.startup.mode" = "latest-offset" ); create table qualified_cars ( car_id STRING, car_owner STRING, car_age INT, average_speed DOUBLE, total_miles DOUBLE ) WITH ( 'connector' = 'gaussdb', 'driver' = 'com.huawei.gauss200.jdbc.Driver', 'url' = 'jdbc:gaussdb://192.168.168.16:8000/testdwsdb', ---192.168.168.16:8000替换为DWS的内网IP和端口,testdwsdb为创建的DWS数据库名 'table-name' = 'test\".\"qualified_cars', ---test为创建的DWS表的schema,qualified_cars为对应的DWS表名 'username' = 'xxxx',--替换为DWS实例的用户名 'password' = 'xxxx',--替换为DWS实例的用户密码 'write.mode' = 'insert' ); /** 将合格车辆信息输出 **/ INSERT INTO qualified_cars SELECT * FROM car_infos where average_speed <= 90 and total_miles <= 200000;单击“语义校验”确保SQL语义校验成功。单击“保存”,保存作业。单击“启动”,启动作业,确认作业参数信息,单击“立即启动”开始执行作业。等待作业运行状态变为“运行中”。步骤6:发送数据和查询结果使用Kafka客户端向步骤2:创建Kafka的Topic中的Topic发送数据,模拟实时数据流。Kafka生产和发送数据的方法请参考:DMS - 连接实例生产消费信息。发送样例数据如下:{"car_id":"3027", "car_owner":"lilei", "car_age":"7", "average_speed":"76", "total_miles":"15000"} {"car_id":"3028", "car_owner":"hanmeimei", "car_age":"6", "average_speed":"92", "total_miles":"17000"} {"car_id":"3029", "car_owner":"zhangsan", "car_age":"10", "average_speed":"81", "total_miles":"230000"}参考使用gsql命令行客户端连接DWS集群连接已创建的DWS集群。执行以下命令连接DWS集群的默认数据库“testdwsdb”:gsql -d testdwsdb -h DWS集群连接地址 -U dbadmin -p 8000 -W password -r查询DWS的表数据。select * from test.qualified_cars;查询结果参考如下:car_id car_owner car_age average_speed total_miles 3027 lilei 7 76.0 15000.0
总条数:2749 到第 页
上滑加载中