ÕªÒª£ºStreamCQLÊÇÒ»¸öÀàSQLµÄÉùÃ÷ʽÓïÑÔ£¬ËüÓÃÓÚÔÚÁ÷£¨streams£©ºÍ¿É¸üйØÏµ£¨updatable relation£©ÉϵĿɳÖÐø²éѯ£¬¿ÉÔÚÁ÷´¦ÀíÆ½Ì¨·Ö²¼Ê½¼ÆËãÄÜÁ¦Ö®ÉÏͨ¹ýʹÓüòÒ×ͨÓõÄÀàSQLÓïÑÔ£¬Ê¹µÃÒµÎñÂß¼µÄ¿ª·¢±äµÃͳһºÍ¼òÒס£
StreamCQLÊÇÒ»¸öÀàSQLµÄÉùÃ÷ʽÓïÑÔ£¬ËüÓÃÓÚÔÚÁ÷£¨streams£©ºÍ¿É¸üйØÏµ£¨updatable relation£©ÉϵĿɳÖÐø²éѯ£¬Ä¿µÄÊÇÔÚÁ÷´¦ÀíÆ½Ì¨·Ö²¼Ê½¼ÆËãÄÜÁ¦Ö®ÉÏ£¬Í¨¹ýʹÓüòÒ×ͨÓõÄÀàSQLÓïÑÔ£¬Ê¹µÃÒµÎñÂß¼µÄ¿ª·¢±äµÃͳһºÍ¼òÒס£ÔÚ¹¦ÄÜÉÏ£¬StreamCQLÃÖ²¹ÁË´«Í³Á÷´¦ÀíÆ½Ì¨ÉÏһЩ»ù±¾ÒµÎñ¹¦ÄܵÄȱʧ£¬³ýÁ˹ýÂË¡¢×ª»»µÈ»ù±¾SQLÄÜÁ¦Ö®Íâ, »¹ÒýÈë»ùÓÚÄÚ´æ´°¿ÚµÄ¼ÆË㡢ͳ¼Æ¡¢¹ØÁªµÈÄÜÁ¦£¬ÒÔ¼°Á÷Êý¾ÝµÄ²ð·Ö¡¢ºÏ²¢µÈ¹¦ÄÜ¡£
StreamCQLÖØÒª¸ÅÄî½éÉÜ
- Á÷£ºÁ÷ÊÇÒ»×飨ÎÞÇî£©ÔªËØµÄ¼¯ºÏ£¬Á÷ÉϵÄÿ¸öÔªËØ¶¼ÊôÓÚͬһ¸öschema£»Ã¿¸öÔªËØ¶¼ºÍÂ߼ʱ¼äÓйأ»¼´Á÷°üº¬ÁËÔª×éºÍʱ¼äµÄË«ÖØÊôÐÔ¡£Á÷ÉϵÄÈκÎÒ»¸öÔªËØ£¬¶¼¿ÉÒÔÓÃElement<tuple, Time>µÄ·½Ê½À´±íʾ£¬tupleÊÇÔª×飬°üº¬ÁËÊý¾Ý½á¹¹ºÍÊý¾ÝÄÚÈÝ£¬Time¾ÍÊǸÃÊý¾ÝµÄÂ߼ʱ¼ä¡£
- Window£º´°¿Ú£¨window£©ÊÇÁ÷´¦ÀíÖнâ¾öʼþµÄÎޱ߽磨unbounded£©¼°Á÷¶¯ÐÔµÄÒ»ÖÖÖØÒªÊֶΣ¬°ÑʼþÁ÷ÔÚijһʱ¿Ì±ä³É¾²Ì¬µÄÊÓͼ£¬ÒÔ±ã½øÐÐÀàËÆÊý¾Ý¿â±íµÄ¸÷ÖÖ²éѯ²Ù×÷¡£ÔÚstreamÉÏ¿ÉÒÔ¶¨Òåwindow£¬´°¿ÚÓÐÁ½ÖÖÀàÐÍ£¬Ê±¼ä´°¿Ú£¨time-based£©ºÍ¼Ç¼´°¿Ú£¨row-based£©¡£Á½ÖÖ´°¿Ú¶¼Ö§³ÖÁ½ÖÖģʽ£¬»¬¶¯£¨slide£©ºÍÌø¶¯£¨tumble£©¡£
- Ëã×Ó£ºËã×ÓÊǰüº¬ÁËһϵÁÐÔËËã¹ØÏµµÄ×éºÏ£¬±ÈÈç¾ÛºÏËã×Ó£¬¾Í°üº¬Á˲éѯ£¨select£©£¬´°¿Ú£¬¾ÛºÏ£¨aggregate£©£¬ÅÅÐò£¨sort£©£¬´°¿Úǰ¹ýÂË£¨filter before window£©£¬´°¿ÚÖ®ºóµÄ¹ýÂË£¨where£©£¬¾ÛºÏÖ®ºóµÄ¹ýÂË£¨having£©µÈ¹¦ÄÜ£¬³ý´ËÖ®Í⣬»¹ÓÐÁ÷²ð·ÖËã×Ó£¬Á÷ºÏ²¢Ëã×ӵȡ£StreamCQLÖеÄËã×Ó·ÖΪÈýÀࣺÊäÈëËã×Ó¡¢Êä³öËã×Ó¡¢¹¦ÄÜËã×Ó¡£
StreamCQL¼Ü¹¹½éÉÜ
StreamCQL×ÜÌå¼Ü¹¹ÈçÏÂͼËùʾ£º

ͼ1?StreamCQL¼Ü¹¹Í¼
StreamCQLµÄ×ÜÌå¼Ü¹¹·ÖΪÒýÇæ¡¢¹¦ÄÜ¡¢ÒµÎñ½Ó¿ÚÈý²ã£¬Ã¿¸ô²ã´ÎÖ®¼ä·Ö¹¤Ã÷È·£¬ÔðÈÎÇåÎú£¬¿ÉÒÔÇáÒ×½øÐй¦ÄÜÍØÕ¹¡£
1. ÒýÇæ
StreamCQLµÄÒýÇæ²ã£¬¿ÉÒÔÊÊÅä¸÷ÖÖ²»Í¬µÄÁ÷´¦ÀíÒýÇæ£¬±ÈÈçFlinkµÈ£¬Ä¿Ç°Ö÷ÒªÊÊÅäStorm¡£
ÒýÇæ²ãµÄ×÷ÓÃÔÚÓÚÍê³ÉÍê³É¶Ô¸÷ÀàËã×ӶԵײ㲻ͬÁ÷´¦ÀíÒýÇæµÄ½Ó¿ÚÊÊÅä¡¢ÍØÆËµÄ¹¹½¨¡¢Ìá½»²é¿´É¾³ýµÈ²Ù×÷¡£
ÒÔStormÊÊÅäΪÀý£¬ÔÚStormÖУ¬¶ÔÍâ½Ó¿Ú·ÖΪSpoutºÍBolt£¬ÆäÖУ¬Spout¾Í¶ÔÓ¦ÊäÈëËã×Ó£¬Bolt¶ÔÓ¦Êä³öËã×Ӻ͹¦ÄÜËã×Ó£»StreamCQLÖÐËùÓвÙ×÷ÊÇÒÔËã×ÓΪµ¥Î»µÄ£¬¸÷ÀàÔËËã¶¼·¢ÉúÔÚ²»Í¬µÄËã×ÓÄÚ²¿¡£Ëã×Ó·ÖΪÊäÈëËã×Ó¡¢Êä³öËã×Ӻ͹¦ÄÜËã×Ó£¬ÔÚStormÊÊÅä²ãÖУ¬¾Í°üº¬ÊäÈëËã×Ó¶ÔSpoutµÄÊÊÅ䣬Êä³öËã×Ӻ͹¦ÄÜËã×Ó¶ÔBoltµÄÊÊÅ䣬ÒÔ¼°emitµÄÊÊÅ䣬topology builderµÄÊÊÅ䡣ֻҪͨ¹ý¼¸°ÙÐдúÂë¾Í¿ÉÒÔÍê³É¶ÔStormÒýÇæµÄÊÊÅ乤×÷¡£
StreamCQLÒýÇæ²ãºÍStreamingµÄ¶ÔÍâ½Ó¿ÚÈçÏÂͼËùʾ£º

ͼ2 StreamCQLµ×²ã½âñî¼Ü¹¹
StreamCQLÔÚStorm×ÔÉíµÄIRichSpout£¬IRichBolt½Ó¿Ú»ù´¡ÉÏ£¬ÊµÏÖÁËStormSpout¡¢StormBoltºÍStormOutputBoltÀ´ÆÁ±Îµ×²ã²»Í¬ÒýÇæ´øÀ´µÄ½Ó¿Ú±ä¸ü¡£
StreamApapterÊÇÒ»¸öÊÊÅäÆ÷£¬Ö÷Òª×÷ÓþÍÊǽ«StreamingËã×Ó×¢Èëµ½SpoutºÍBoltÖС£
IInputStreamOperator¡¢IFunctionStreamOperatorºÍIOutputStreamOperatorÊÇËùÓеÄÊäÈëÊä³öºÍ¹¦ÄÜÐÔËã×ӵĽӿڣ¬Í¬Óû§×Ô¶¨Òå½Ó¿ÚÒ»Ö¡£
¸Ã¼Ü¹¹Ê¹ÓÃÒÀÀµ×¢ÈëµÄÔÔò£¬ÊµÏÖÁ˸÷¸öÿ¸ö²ã¼¶Ëã×ÓÖ®¼äµÄ½âñî¡£
2. ¹¦ÄÜ
¹¦ÄܲãÒÔStreamºÍWindowΪ»ù´¡£¬¹¹½¨³öÁËJoin£¬AggregateµÈËã×Ó¡£
Stream¼´Á÷£¬¸Ã¹¦Äܹ¹½¨³öÁËÕû¸öÁ÷´¦ÀíÆ½Ì¨Êý¾ÝÁ÷µÄ»ù´¡¡£¶¨ÒåÁËÊý¾ÝÁ÷¶¯¡¢½âÎöºÍ·Ö·¢¹æÔò¡£
Window£ºwindowÊÇÁ÷ÉÏÒ»¶Îʱ¼äÄÚÊý¾ÝµÄ¼¯ºÏ¡£StreamCQLÉϾø´ó²¿·ÖµÄ¼ÆË㣬¶¼ÊÇ»ùÓÚ´°¿ÚµÄ¡£
Á÷ºÍ´°¿Ú¹¹³ÉÁËÕû¸öÁ÷´¦ÀíÆ½Ì¨µÄºËÐÄ¡£
StreamCQL¹¦ÄܲãµÄËã×Ó°üº¬JoinËã×Ó¡¢AggregateËã×Ó¡¢SplitËã×Ó¡¢MergeËã×Ó¡¢FunctorËã×Ó¡¢filterËã×Ó¡¢unionËã×Ó¡¢ÊäÈëËã×ÓºÍÊä³öËã×Ó£¬Ä£Ê½Æ¥ÅäËã×ÓĿǰÔÝʱûÓÐʵÏÖ¡£
JoinËã×ÓÌṩµÄ¹¦ÄÜÀàËÆ¹ØÏµÐÍÊý¾Ý¿âµÄJoin¹¦ÄÜ¡£Ä¿Ç°StreamCQLÖ§³ÖµÄJoinÀàÐͰüº¬Inner?Join£¬Left?(outer)?Join£¬Right?(outer)?Join£¬Full?(outer)?Join?£¬Cross?JoinËÄÖÖÀàÐÍ¡£Ä¿Ç°Ö»Ö§³ÖË«Á÷Join¡£ÓÉÓÚÁ÷µÄÌØÊâÐÔ£¬JoinµÄʱºò£¬Á½¸öÁ÷µÄÊý¾Ý¶¼ÊÇÔÚ²»¶Ï·¢Éú±ä»¯µÄ£¬ËùÒÔÁ½¸öÁ÷ÈκÎÒ»¸öÁ÷µÄÊý¾Ý±ä»¯£¬¶¼»á´¥·¢Join²Ù×÷¡£Èç¹ûÖ»ÏëÈÃij¸öÁ÷´¥·¢Join£¬ÄÇô¾ÍÓ¦¸ÃʹÓÃUNIDIRECTION¹Ø¼ü×Ö¡£

ͼ3 Ë«Á÷JoinʾÀý
ϱíʱµ±ÓÐÊý¾ÝÁ÷¶¯µÄʱºò£¬Ë«ÏòJoinµÄÊä³ö¾ÙÀý¡£

ͼ4 Ë«Á÷Join½á¹ûʾÀý

ͼ5 Ë«Á÷Joinµ¥Á÷´¥·¢JoinʾÀý

ͼ6 Ë«Á÷Joinµ¥Á÷´¥·¢JoinÊý¾ÝʾÀý
FilterËã×ÓÊʺÏÖ»Óе¥´¿Êý¾Ý¹ýÂ˵ļòµ¥³¡¾°£¬²»Ö§³ÖÈÎºÎÆäËûÁÐת»»ÔËË㣬²»Ö§³Ö´°¿Ú¡£
FunctorËã×ÓÔÚFilterËã×ӵĻù´¡ÉÏ?Ìí¼ÓÁËÁÐת»»ÔËË㣬֧³ÖSelect×Ó¾äÔËËã¡£
AggregateËã×ÓÊÇÒ»¸ö´ó¶øÈ«µÄËã×Ó£¬ÔÚFunctorµÄ»ù´¡ÉÏ£¬Ìí¼ÓÁË´°¿Ú¹¦ÄÜ£¬²¢Ö§³Ö·Ö×飬¾ÛºÏ£¬´°¿Úǰ¹ýÂË£¬´°¿Úºó¹ýÂË£¬¾ÛºÏºó¹ýÂË(having)£¬ÅÅÐò¹¦ÄÜ¡£

ͼ7 aggregate¾ÛºÏËã×ÓÄÚ²¿¹ØÏµËµÃ÷
SplitËã×ÓµÄÖ÷Òª×÷ÓÃÔÚÓÚÍê³Éµ¥¸öÁ÷µ½¶à¸öÁ÷µÄ²ð·Ö£¬Ö§³Öÿ¸öÁ÷Êä³ö²»Í¬Êý¾Ý¡£
 ͼ8?SplitËã×ÓʾÀý

ͼ9?SplitËã×ÓÊä³ö¾ÙÀý
MergeËã×Ó×÷ÓÃÕýºÃºÍSplitËã×ÓÏà·´£¬Ö§³Ö¶àÁ÷µ½µ¥¸öÁ÷µÄºÏ²¢¡£MergeËã×ÓÒªÇóÿ¸öÁ÷¶¼ÓÐÒ»¸ö×Ö¶ÎºÍÆäËûÁ÷ÖеÄÒ»¸ö×Ö¶ÎÆ¥Å䣬ÕâÑù²Å»áºÏ²¢×öͬһÌõÊý¾Ý¡£ÀàËÆ¹ØÏµÐÍÊý¾Ý¿âÖеĶàÁôµÈÖµJoin¡£

ͼ10?MergeËã×ÓʾÀý

ͼ11?MergeËã×ÓÊý¾ÝÊä³öʾÀý
UnionËã×ÓÔÚCQLÓï·¨²ãÃæ²»Ö§³Ö£¬µ«ÊÇÔÚCQLÄÚ²¿£¬»á×Ô¶¯½«Âú×ãÌõ¼þµÄËã×ÓÓÅ»¯ÎªUnionËã×Ó¡£UnionËã×Ó²»Ö§³ÖÈκιýÂ˲éѯÔËË㣬ֻÊǼòµ¥½øÐÐÁ÷ºÏ²¢¡£
InputºÍoutputËã×ÓÊǵ¥´¿µÄÊäÈëºÍÊä³öËã×Ó£¬ÆäÖаüº¬Êý¾ÝµÄ¶ÁÈ¡£¬Ð´È룬ÐòÁл¯¡¢·´ÐòÁл¯¹¦ÄÜ¡£
3. ÒµÎñ½Ó¿Ú
StreamCQLµÄÒµÎñ½Ó¿Ú¹¹½¨ÔÚStormËùÓй¦ÄÜÖ®ÉÏ£¬·ÖΪCQLºÍIDE£¬ÆäÖÐIDEÖ¸µÄÊÇÀàËÆEclipseµÄ¿ª·¢IDE£¬ÕâÖÖIDEÒÔ¹¦Äܲã¸÷ÀàËã×Ӻʹ°¿ÚΪ»ù´¡£¬¿ÉÒÔºÜÈÝÒ×½øÐÐÍÏÀ×§µÈÁ÷ÍØÆË¿ª·¢£»IDE¹¦ÄÜĿǰ»¹Ã»ÓÐʵÏÖ¡£
CQLÖ¸µÄÊÇCQLµÄÓï·¨£¬°üº¬Óï·¨¶¨Ò壬Óï·¨½âÎö£¬ÓïÒå·ÖÎö£¬Á÷³éÏóÍØÆË¹¹½¨µÈ¹¦ÄÜ¡£CQL¶ÔStreamCQL¶ÔÍ⹦ÄÜչʾµÄÈë¿Ú¡£Ïà¹ØCQLÓï·¨Éè¼ÆºÍ¶ÔÍâÍØÕ¹½Ó¿Ú¿ÉÒÔÔÚGithubÉϲ鿴Óï·¨Êֲᡣ
|