From 5f687ede006c8b8fb52882c0695a60da325b0625 Mon Sep 17 00:00:00 2001 From: Lizy Geogy <31404069+lizygeogy@users.noreply.github.com> Date: Wed, 12 Feb 2020 18:02:27 +0530 Subject: [PATCH 1/4] Community docv1.2.0 (#1533) Updates to exec-scala, snappy-scala CLI Remove VSD --- docs/Images/snappy-scala_api.png | Bin 0 -> 222210 bytes docs/Images/snappy-scala_api_1.png | Bin 0 -> 223600 bytes docs/howto/connect_using_odbc_driver.md | 24 +-- .../use_apache_zeppelin_with_snappydata.md | 14 +- docs/install/building_from_source.md | 20 +- docs/install/install_on_premise.md | 2 +- docs/install/system_requirements.md | 4 +- docs/programming_guide/scala_interpreter.md | 102 +-------- ...ted_by_installing_snappydata_on-premise.md | 4 +- .../command_line_utilities/scala-cli.md | 76 ++++++- .../statistic-sample-rate.md | 2 - docs/reference/sql_reference/exec-scala.md | 199 ++++++++++++++++-- docs/vsd/collecting_system_stats.md | 2 +- docs/vsd/system_performance.md | 8 +- mkdocs.yml | 18 +- 15 files changed, 293 insertions(+), 182 deletions(-) create mode 100644 docs/Images/snappy-scala_api.png create mode 100644 docs/Images/snappy-scala_api_1.png diff --git a/docs/Images/snappy-scala_api.png b/docs/Images/snappy-scala_api.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9037a7c570c3258920475d10c7543943154d16 GIT binary patch literal 222210 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%0AjC!`k1jY^cj9qqb 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⪼|(csU9){QCU<525Gx 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 Y$vu_xNAhsj+|TX6X4a-vS0BXw2Z@7IrvLx| literal 0 HcmV?d00001 diff --git a/docs/Images/snappy-scala_api_1.png b/docs/Images/snappy-scala_api_1.png new file mode 100644 index 0000000000000000000000000000000000000000..31e814ae905df573592e5fa2117712ebf97c1b13 GIT binary patch literal 223600 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%0ARxTv?QayK1at!I6&R_S@P9vRCVM zK8le~*KQ;{)-=X+^X_hIL~PIx)=6WHy0h9YsHsm=*QDBpzN+pQog(H;C=&^cJVYNe zhuKa@jxJ9TR;!Oc463X%|Dz=Baf!^7o$g%Q&Le$SOY*lNZTZIE^h5^h-5sr++^oC= z28_P(#PDboQZI!E&N7ie_45EI%&>*Q-a|5%{;Oudx}K@xk-w*xb2LyTi?E{LyDJ3E z5l93BBS7mtmoQ$`Hh7>xWfjk+l7m%ELf)TEjup-$#s&=kUQU!%1pcP2TQp~p)ufOg z0Of)OhVkdb4JNVCc@CQ`XI#oE;^QIhyC*j1&JZ3KwktA_vnWNNVls3lapUAJkb{DZ zlxXosb9-HD^JK1)V?dTY)ce1|ZBS+-KM%}gUSV&r^s+5!mVx`-8-~83WcuX*^piZp z`o^O7`Tnhd^{=Yu+xCA_TNe<3T_ZC34@fTC-Ov)(5E5M!)!MlW9e1%3$F9~m<2vnd z%jW2)G`EEFx7KVMCOf!<^5>xQ#9*N-b^GD2n9joQMRs{E@?m%45nVD#so4RAe=}pl zD@s$Ns)`mzScm@v>~BDn^s~5$tcT3bs4O05`YH+IHWtBiHdQ#{?5_N%u!QP_6#uM- z{Nh6sQp^$te0PBvX$dtwu$Bfmn(N_Y%o!K?IeCu0kk0ap{E`wEkGo}#t!#=iG-vt& zla-1#aN6vIdCH8AV@`M64mVtmR*UqEg0Re@xaUFlBj)jvGsz4a!m8{j9t|CDt51m zlEQ1EW8fU$?Y!~16wp1J2t&be3+%`%^574o6(B&QaMd3wEG?*;>71Ajk-6V3^(!o{ zERN4jj*qKtOvtNqy?o@bAa(}tN>l4l#s}B_PAX{X?r@tyH_CwxW|Gku{H|QM;PxZN z<7}_MPqV2JkKzbc!&-nve^{1Q{x_;B7?(hUhIQso)OG6GUoQJ83VQ|uy zNeEVrl0m2Y;st{bj;RAvBAxT>S3OIzPHf}P8pq;*ja5GsUje}^<9!f>uS@rp?XmvU z6EYX2Z}4BXyUyx(n9jM5-=4!W}|fkA%D7oz5)p?bMt@Z;YNO4Mt^$slnKsSPVt#1;;yh=KcLW+0H_T+Y9y)8z6;+lzwU}Up@ zVJDv>wrdQrrHt%pGaKO$8&RV$I7unco+P}lnWW-)iYlk&+WqS;&cxTy5c?ot@?=xr z)_PnGb>!!P;9lT-N^Ht%EMNW8rG_2eK~ceE1+MI?8~n(4dy2;$x*-M&70eN^6x(bM z-VIF@A7Afi2CYC`{XG9=J_u{fq={T&*Q2tA2Y|C?pdPIbd`^@(K$>ViBe_>_AlEVT zM1t`>P8h9&$7C{0QJnB_^DQ4)lC-&^{14W#bL|iO&lmxs#yX+?b3hOdDGfR-)3Ef7 z&AXSyd?Wt%78oPY&0TuuSp2Hs{NcpH-av*~xNM}kxdsE0srwTA?>fUzE&*M6W|oK= zMjED$LnAtp_sNzo(E5UFHNOC^A(0feeba$si}C=L%m6>XbJ+hW3Q4}QNMz%c!-_90 zSJP8APh6is1|sKF{gbqut5PQ4N4|IYuOX6Z^Izr~ntOvq(N3c7|9M0@|L@iR^QB2h z{(t_4Ygj*!Jd`pQeZS$ovj7_}&*u~i zJS^QpZa^{Ux)8T5Y%tzFN|BVmvx{Jm3X|)9JiAw+9pu4$vr7l$zz}BjHW8Ci9Ml

KJxtfr9u$P%iJ64gd8F5ze-7WK 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�j<)aH)6hg!Q`^4; zHJRQ%wqveLsQ<}XDRuX58l>=%S1+-R4H?hZg;w!lv0UfYP zX!-#i6(he%J&@DBll)^YdT%cI{QjQI(7GFk5OKx2h=-=sEJ1yNzoWbR-pNm|MPY-FySe@ul@hsG4Pk)`7pnFrxK;uhU1lKfOpY@bak_DCXdQxsn<0zVW;6_( zn=rmrak|~#nABCxv&CeUKtR|_Me>Z8KE}vb+CUHW4c|B!31!j>SlSXokqAptfhwXp zAu!;zR#7O#!_w`$p&EA}09};(Km}2J&E*Za1Xm;HQvOvXc;B-Pwy6GMmp1TrXw&C2 z=ks-6K%le0tIIZ<57#MiP^Z}IA&2(qDv9U3VM*n#R6~NpG5W zc{>Ee=bhvaA!TI95120E{K{k*pzgBIlU>%lHm;s1u9im5NsY^&pFJ&?@d95GE9I%} zPp&z@rsA7=J}=uH97$RpTmoyC6#-ym%2nQvVr^x^tC4GY6S${8E-S11wX)R8Pz)KC z!21@3gUD76i4|V!v|%8&O1h7e&hSrrF*c#ibj*X=0!PxL%nZHE;^B`lV%O=(uzyUl zW#O zr3NFN-K?}9vJ>)eWZ?cnYT(%U0oInXoHPe@+Z)PG?2QlqO^qe8o{DmDGap~eCFc** zlA34YE;4d*u(mS!@-&&ySOiOn11VF+!-es$MV6M{MqnLIj%OBk+Y}Z$fb@z6h`g=L z{Ccwfn)9*wdHD%WjqZ4?@f&f!Z~Z>4hW~V9vB>ugRc3~YaLf@DgY2BNa$2^&O5hG@h`p!acvEvm#$au0V;l3W zJhN%9x|ZnYIb0o{sO(HCe7f+1b&jj%0wcK7Yxm-I(O;r8%{-_nufRVaYJMx|wRJz#{^z?Qz zPm3<;Nv`P$4@63cRBFsYLpJxi_R6oK?uN_ht_3^jzIwV5s1yKF0fZE%7MC{|5d<0vM`}t$;&pM+KbjX$6&Y&$ zW8q~}PDwq+$w1Xxl*J{Yk8uuk$WPxVP&(|vK~Uoxff9g5ZwuYynfTgcfT6Xtl8L21 z;Z=*ig$fD-YA+Ac)>T?q8nt)ykF6*U{1IAMN=Qv*Zc3tt`+YlbUUnUi{9Uq)t}y=E zzY^l_Z$V{968dYaHfK7zDAtjn;Eaw?IF$#0++EQVHz-EOBS1r&p0mZnJim=~s&DG= z=)%lDjz42E*LU7hcKS&O<(j&s;m+9o3ZH6!{?ui%F8r*9eq*4yl=b4=KCK}?W#)wr zI47x(fG?&9)e889blCvK2B%>k8?bRsu`a6Eyx|{HH#8NAg8hPcXKYfV@D0-A=UKS&&Kv`^iTfqoB_2oM!e*OKP0$GlHP%t3&OH( zjvKppZ6dU9zfR6fF3`6REGdZTg~QeKeQfAv_O?UOvqUd?d7ST>?_#eV81;9z3+`&_ zw}0>@e0?2WDZgFodaoQ%s((pQ8@6nGeuBh<6k@ZUXb&wGuZVQ;8rTt*UVY^tWFTaK z6Mkb?d=`luvSAjqw?qCuElh>1@0v9ZH@1*H%-y?cAUuJH+rFw40WEO&6cDmZK{E&g ziM(=zOSweeHQx4s|r=nzBizil5p+e;@((VNMEAV=!fdq)+9#T z*rwPkZV@MHD}zy?>8SyZiooaYOf-G{Ys)fRU(*z`COnp@RYL&*R6dl$$?KxtbpL!L<(uzGt=HFy|<)jj{ z)EzWmXRpj%16nZgc+O%1>eO!k!Ie#J@RU0}FC>P;ZT8N;<)vruaAM+Y7j#U4O=S3G z5l_!l|MV-_>U0zAr<`FrN9zj`c#8uz=QiVh!RViUDQ2%P-(_=cjoDQq!i zw9^Sn5%2CfTo7Z;@zXOdzBVx%^O%NE3R9NX*_wj{_(Y>{ZDt z3S~;>6_^2x>T%;&h~L^HI(y3vs(t=d#|1}0=@8=4YvE(U^b-ZomB?rjB6hw$B|UUE zT9Hz99L641W~9lVm!D5L<@Yhc1E@2Bv$2WKota5LDAK{Ao!jjhm&aWbrYLFZR~5>k zm6QbJF@!KKSE@^5iTK2y0(>Z={s=9&loq&1UiCDp=$}!-8=}%yV7F#2CaG0aXw4DI zDrfz|MLmLs5*lCLP!E9q_{tpDF)S6iX1S|5pOC(;4POiVI?9(hkJPRH^5wnmZ@z?t z-<9YwKz?dgYs;<$$27o=@s$h)bZ;xD8@|eKZt>O zr*{5U2z^#|KI3b&SW7r_jQuUPJiEVOMT2dxq^>-T7owu)i{QR0)KezKM;}7Tgo(1* zYzb_#5q^WtB^~{BiFc03g4yAZ0VQn(j$3=XtDX=>a1F=t&|v9w`&C~+IV31~K#%f( zwb5Um*2%tZIW9le3!;yl6lcKJOq|Cww(WbWAr7*ECgM2E;o}4=q6ILpzA!B|rrcLO zkZQ@1ZkkYjvJuXCO59msNj2w3K(@7149m*Dk;fu*louJD_x}y%W&>t!^WU}G!xZ-5f|D*Bw zC(n};2I!NKl{&%8na(Ili990c#$b1yefT3QZw0}c60HuTt)hDeCk3z|$X;O)DwoAL z3}F_AHKG5PN&luY^}n@SO6pNFq8`h2AjSYc{*yJ`J>;V}uMNMCeOTRIzUaV(7ZMs&}( zg|FbmaCa4c_%v!`T88exjyoJ#cli}w)NPa-yZab`0J^X-+i0DFI4)3K`LDS)`2qs{ z@|rSdaKcw9VR;rxd(axtqk5>`=Pk~(De@AsMURq{hRM(T( zWE3{j%Po?LQ%Xv22!+?0dp>c*5C|k8Od_&8$dOhz2c7C}qx~HvB%r(x?uT&~(GufE zoMgqc80v#9-9q9N0N;ev)TD4cUNe3%kUC{kOH@ujXR++{BM^OOZQ>M!8iFJOKj@km^eXjATf}Ad{HES^jd@Tz?#TvG4YQ}Ez z9+;yl2XDuW3`OdW+k+aXLd<1T!n3Z3JzF*TnHCI9 z;F}j(dF(^9u}&ijO(@{=miQ-aq6IDn!BC(vZR1he^FKzF$H%`kf_&(YEE+SF&DRH^ zs08tR|A(h@jE=19qIH~fY_rp`ZQHi3PSUZ{u{*YH+ji2iZQJg9-tXRV^Se@YM%CH- z?6uaM&m^L9ha`s>hCYz{%We@e8s=@u_lYj4>kZvjv9vj-xIt5t@74Hy7^T1#Z>^h8 z>HAv>}8DLm8AQat95|{z4&{9q6luqTX0ftA#DwgmMtzR7Qp`{ry!*GbAD$5Z`H8 zGT7f&_Y^>hVkd1D;t%NoNlI(bdb?@fl->G4ch-<;7MSy^YDggx^yZp&)G4zQtBzi3 z!0A#fbWkvCg4pHeJV(1TDb=HnV@CPA(c^#&xK(zuBH{^GW}cY33{u^azStAJ@(!$W zkQ`n0{-Uc$7^Jg-M(>E9=3r&mdV?8>a6f7QAyr!NYIBISF1KAC#^+xt#APl@W5$=u z-#niSt4xCQ$>`rI2z0R}pPK_gs7GZzO0Z(%unXr7;Y~;O1W6 z)(%ShAI##Xp4maej8wEjVi_t#_n#*9ZzCNO`=T-D{P__=Y*rpj1NwL5s9rLP;_Nmb zi!1>d^>cJ*X+l3sBNaiVI|IILLF%$voZO1Ha1o)pm$cA2z7tKU4?&DdOKu!tn6cf& zTw&u0>?(f89MrPw%ShB_+E#1Cw*NKqMB|v+O`b{syT|lcNpM24(00D(Hy5fm)L-qn zJ7k@}9uT@F|HFQhlWE<+uByr%6uv9}cSI3t6eQ)a$i=_MN?- z*VFoZF|tq4gtX}18}~P%G#2 zXHs5&nmWNxQN0hML3Kzc+)}QvQ4wT>NNoFj{w!?>yem^=URb$XuTj@gZo&|ao>Ww2 zvIGJt6?g0YOxfblA~KmI%sW+iwJINaB*2kmay`FUr6k1fA)HC46VsD*9kgHNZ9%)b zi!)BUpb%t4gcl`^wb$!1xKU(cU(NaF(e`*mgQ~%^^Y}P7T@$)9%v9{1nK!Kqc)xqM zHaI;?NnjcD7y#5vRm`sZotNgVd3$Rd+6lC=rJNhZ-E7Q{K>bfKe1_PJS z3a~Xnw7_IbJbmk`+saNG%X>k4y<}?JkGbnq6ObD&K+o$}?2=D!9Qq?sI zIbMr%0@*cq)D~9{qX5eJ(OoU!yuHsc&Hlz?Y2R7U?qvNA%(NmqUm>EcbwK@;&REhW9+J4gkKONOIQ6C{Ph}`_0V?_Q4+D)JQU*=^sPClg5v$HKOjZ7@c zLh(8NI@%j-{4F-MO=WjN(%O>JuEy(g90FCM)SuRX;L|1Ml-MP?i1M=QCm{0#Fw)2z zL@Rk;e}7|i(7bozlge43hXCg0?8l7$m|YL@OCzGae&L~ZlWR^*HBk} zfM7}iCdv#mEQ%;$#R+;p_03(J)Fcd?oW%UH2;mY_P)3EIhx|avNYUroU!BJ#z>vWU zRi_q?q$>(S*5rHWSmZZos*H@g$u*yubAoi&KHlqokaTr^F@1NiEuy6SQQFy7$+<19 zb^?Jx3shPJG*D51cXRJ5E}NQ^_M<+x(P4l6Uw0b4?B8z+k_dURnCYoU`*sZ9r3vo5 z&}Z&D>jR4U38}=|T&mbEgU09ZCBR?d45ej$6u286-WlsVKx+v4j$ybwllZnXkqK3yBBKl4IXh;2@}%p+aOpExltij z>PK#2abwcT%v>z;UNjm;F*~7%f)ku$>6(_rv8gJXn(G5Qn+6mQo)ZaE)bp<7^Fw-B z)vAB=!REa3)Cck3Ma3&Hyc$hdE8o0{WzCdk9BdcO$;KIhjRMGQxbX_n%E5=p#L-+jQxVi9t^z~x(I#$W^4U)3bM=X~7 zDu8D62JQzrXZd@7%6zd+ZjI#0yY0X|>fAKaHDmz<^Fmes(WrZ7?rM|n% zG=x<)j)&YmWe+E(OETD?6aBkNm!HXi^~0Y0EyUDHRdu=X^_D@gzZ!m;_ny75J{F)6 z`!A&3OY?Y8(x$neqS;drCS>`Mp(cR`5AEr2ey5aEhVHhDFpv)**)~4coS)l{&ZDky zEfP^c5hv7Jh{z{u% zL*dUNIh679H2LOXEH-0=PMg{Tyldj=Jo%+}_J0l|49DS8_rp)wh+srKMTyY8q<{t) zm`{YJLx(Xdl2fs^u8HYv`FBYW<64y)u1idB3V?GFN*N=i=r{sX*Tv4n#`lAStkM+- z5~Dd?^2FZ=9rE*+kS4A*dmpOI`EhM^7CaTP046~cirZahpx07f4#eX2_-{-C;hTek5P)Au1rUZGW-E~SAr2Xqa)EJ z1`(~_wy_n`!A%T9EPz}8vl0E4XHd{X0bbMHUNY4A-*E@x?>}C#NVeZ{Py^eS|LH~L z|CbV=$y3Xicx49tsu}}|0EI|f(HNcir$+&J%(MZWN*s@mL~?-iw&kaZjOG5rV}Z`a z#~95MGevy-?`{3ErT`gK9~~0aZQPuRU(|{I7H(7{qhZnC-ayJy@nkd#iu$a>X<|`# z?==Hn+i=QEg7I&)W7k&nWwu#3bYs$rSnr}ZPbjrsp8RzLCP90@7W!U(X~K*Cy@&`K z;9DHlT=9tF$7k+L&g3)-rjb`0uFU4-|p$)%yfMC=dQR=tP~%7AR@;Z!&?_yqWwHKUfvmb z+TX6gK}wmltY{d<2Ubz^eACJ^RKi(aX7-H}n_}={I&ViJPjLG)U7nViEb@oo!5wD# z#az?ZL-Cq|%t6})e+s?{*bZWoeI*uFE=7BqPlpPwsQIQ`AJ2MnDp6@u1AZ|W{oNpy zBW&*C)quXeK^NNj@M{_MPHjhC+elG^_f)JM$ONql7#qQMn;eVh2LGI`FG%T;+ zRZ_7w$ofJvMpk3t)0RR3Um=idseO8-5-#&EJlSdh(cM2X+PD<|Vl^DaxQ{O@TDo|< zeacMS>5Qn{tIqb1jz7ZGAVWVfVNwh)EsXF#(eEMZpp3C%z8zY(mgwsWMy9M0XQ8#X z4A6|PB>xDXwFw;(oE&e;{0;@xBLoj0nY{gX4yZOasLHcs$rn7+%AH_$uB1-OhtSyF z20fb%3kB{^84~mR z^KrQS94>QV3HNvg48`qQeI$zFN;1z8TeE#nASPz&{IfjY-G2(MPcV={P4a346Uc1) zwrJu|m*h^;QU8W9k)NY zi1WcmI9;OnIkNBfZ~U>_coo%y!Lpsqx$bgQ9D0bQ2jeOwhIQ`NKIKFI^|&CTyh*0q zh`wMX0U?-wuuOhi3rG_eko>!{KApTBwX_uSaR@J}z~PackVu-Y5Y;qWh+CJJ3lFM^Uhdy}inm+WH7(*fKp~R{wfafi-V{(=hIijdQ*ZPOp7fHMnO^r%(dEHQk{yOA_fHDTnAgUakj=EW0VMQ7Y<{Z^MEF$_PYkQxiuDH@|x7LPO0838`wE}z#7 zJqh?Q&0w>(!KBqPn%PewVA_9*yUxWrqrO{MF$y+FBV~KoN^ji<9R~UkuWkC+FYM+~ zoRo*CE1EvfNL=poAZpxOQKsI4`f)Xo2swPB2^z?Wc=}ad-81 zg&V?1G<+~fACgRde#FviNaGoy;%hp%b54=U=P-N~F+}n$sbFS=*sVq)&vSDN9|0!^ z4>N<6gKO2%Tg{>ZUX;h(UVw;}2nr9e=$b%XDIq z)gGXCR9fqbk%p@pXk?@tC~eFxOIe0Lv6jFqK%ZGF+a=k5y1Q_c zj(7XaaPe~m&I@YMdWC!Fp`Do$sf-3b8=#=05!1M)I7-~Xz z*JhUz;}V{8^P6lPLl$C-f&%6S4Np>Xa^&4o5)*$MX=o&fzr(0yW41s0r;4Bi-i_7t z=n?#!9Hj}HuCYnWB(juWj*sgW4)>A>@1tUuYK!fZp8I8Cp`&j!8#wt96ot-##WJ2Q zKN$w+UHsLwc-r==BxOYszB-1$H@H>&%fd-Mx6}|LptK`YeW_S!+v=CHo%!;Mq(OLa zeZL&>tyb`CGRe29z%Fnfvm&zFG!G;Y!d4N@QZs=LbpFoVbk>Enwal~(B7?0pW+n-{ zF_q1X?ME(6F-Az8BAt7mb z>Gg-FeI*5{UAP737rp;(#yE}HdS71?v)0B!cuK^LzfDxQ9*Ni>|0*g|R5!VK=azJl z(4nmmHb2i})FtquD2G5VSm#zM>Ur5}h`FiwelXFLMXxNbqaK@qb16xE=nVQXVu)2&85J^q9E6w&r3@3`+|uwM zwt}0e9L|)NMA?KjHRY1yq!C51S6td{$l3V8#Ybypz`+9}85h^M_^jcA4-avJP5g8;DR&rp9&D&#P2@JfT5^0tvhVnz! zSBkOI)g>fhwKzN+F~f3SP0ODl;_i+Hi#lxhGf9|AL~t=VIu;Y5z?QsynpW6LOHH6O z$I2~rVktjO2LpSPGD0E*?0B&+nd$UGF5uv#2jzEjFOwT9mHi8>20{zB8Lok?fA=gn zfCoU^xy{C2yi#;Ev2B&hL1_M}f2kuFKkZa~(8#;&ja$)@ZHvJ}$KtjfaVWxquze5=9P zbZ5sj$sg+XKm~RlWNmh`EHs9mEyADQ>J(pckemhngHuHK3LE))BnL;Y>Fu!1BZ3uN zN#m>?HYpLJ=lfxZ0VwW)>cJjGF*S1e8)8!$7FP6588Zd&hZtdVPb*!3*S+ z(%p}T{WSWceP8&l9 z6N0*yyt?7-B|p4y5Qlv;KGgjAc$Y%TM{H#1YlO>_@+)SR@GRFdr;oF7ekrTREIGZP z@~N$<)yKzhPrlqq09H|4P7oId`cam#Ab(L^PW{cf;SejA{zf8nN&thMHZ&qj#@tNH z%iil+P{+bT$u~VIxgSA(TvY~HR*!<2hM7CH8I>J|9Ja|_QB$XsR8Wfx{RIn(Q-6w- zKCitiFH%uG@z796$Ccm(?c=-jY-ec+WA6?-7OXSTx4Q6Xxk!!$Rcx{gZ9WpoCRFi;q)GbLq$BlCztI*pN%;)9&{RCKDpG6;xZ}KwI8OT@2gG()k4Z34pN46;9&PQ6##Sp+osxK+tpJ@qTd+2 zKz)6ubjLN-|DUemz~5r14Ug1nwTf|cdeh&PRazpeeQ zL3=w5wNyqjhutZ1>0$6E2hOt$QZcB5(Mr^Hj8Y)f4mS4DD%OC_udbuIj){d-8~0D% z)e1;g6&`Y2in)EEOa{mk=#CU5!5$1jU-4Z_8NzVXcXRgeG$Y^YkM{_0DE2`FvFF&i zqmZlakYQ^B8a;UkFbE~p8@UMi=;hc#OlVziw?|`Y?g=^3I#xU`irliJocOJo#f3$+ z)m0=_)|8NP7r!|IcoX6BQ!z6$HfQ!{#fZT1apT`uHt+&$9x>3KYRVD}?VMb5;g>fy zn=~)*h*;jL*m2ZnLZ@kedg)v+56Lsm=9WA|^|3VO|5T4X%x`O8_zmErqV5kQ-YSnY zZL5HqtStN_n5&@nw=b(;VW3lzNykD4hia4)wUG%+qGoZy0~IF`nO}(-MYbo=*5HD> zi_dLWw{&$?(U4&%YbvNBW>M9TuW#QAW%&)p*-ynpg4oJ2))fw_A&S08T7EAqXT?H^ z9XDPMN_F~}^+zvj$fFDsN_(;q5fmUlFp<)njjV2Q%*YcbCLeHSoYs;)$$dZq!@e>r zQA|vg?wjtnHB@LhoHgSc39v5vxKy3ALekKGqJp`j%@N{~=H!n>Ev}7NrolAhqZd;F zf_hl$8n-flVZ!nZ=j7z7x}4T=A-Shd>hDozKJVLAc3RRQL08pgR}-6AUUxEW?>pof z2IWL<`>-O9E#leU8+<^!CyEtQ9B3<2k|ZT~Mp&(dv9z9qlY)VXid<{~PC&is>eU|t z$OrtK{3tJFbF{i(LCPsPjzp1bqEIJ&O#=bmmfWU}vMx5R?~3Z^kjDERq0dqFmxwc{ zoD;%a@k;%(0u0N`Q~2Ulc1nn`Oze?#w3erK=LD8kHe>R4d&eleLM0VJp2}L*K^3{N z!~;H@n)73HB1xYoGuAy>+VfyUu9t8y%W1KE%?4 z^tSRrcs#U&l6Gq=3m6OloyfozGq+%KR??TVun=->uj3WCDI_Lz${Al{v=B*OV!p8{ zhb|cwfJx%5CIKI$qO!z5(a|)Ovc2aX0y9#E8MmcsRvFqZR&_8+5o1;JPEfI4!wd7N z5;c|+(Nh*K#h#vmg@FIXWd(#~+$DP&3p8<3-Z(Y~;rEQvKH$d``l-3AYB|y6^>mfA z6YE!E&BSKw|8&N79rtETI*$%g;`M90_@va!lGiU{FvS zm$`ij9KMW={1)luO+g7*jtkJp_14(w*Y&*emrIxra<2R5;sy^`#lEP3fCqOXRwhoy z*HoZ^%6P_%N{L8$4h2X&TJqd9Ck8cbV59Z%|0D4;K#}sC@lw1oE5n~B=q>3IU0Qn| ztI)yyX8b3~w4>PD@v;I1k;d(b?Ikv%>Xtx3F(HBwbB<927}m0;1+fBqs4}IcuY8+9 z{mBI#b_nn^)@2BZ=-^pbtVoLgdrc4Q4BlLbqxcgPsMaC)!FZ$O2NPcShtLPw5J(Vn z?X(Tfnm3@@sM+rHW@eeey)+wg`H98#UrvBG;`r1Eir%$>8t1YYFLwS4{eSPq z2f{QTfPq|Wm@81l`f3sJpB3-_Cl~l){12V}|E+t7|2Ng(*gbXk*ga9zo0Rpi7Hj2% zbODH#ttmP^q9r5u_%!9w_`m~kkc8E0EjzcKZ9e(mHS{3;&ISk#yBtxd(%Nfy++hd= zSxQsIFlPaW|9zelL=>{GYei#vG`;o72~5+HX+brC{C<>QeWigf-J!x@dAqqATlc(# z{oOy55+hFfZ(Qp77ye{jT1v}BpX19*ju!`Zb0yVR`;GF#_mVPUWrXjy6JGxabC2VU zIk)rs?|u?6^*Iq;qdi;nj)u4W`ClZ!(#1CTpvjSr1f?W=B1#_p%$L9ct7xj6Y<8f* z%a4w{EPQdq2f9jLVcol#g#X|uL?bzrP?fb4Xe_n~9WGStDBV%hH`lE*H{?v5WG^24#Y+4@=3SQ$u zgjf`<;ht}-89;M8w$1%!v6zfJ&WL5??zWbsWRf_pS#od69NQ{ngv+}uYE6rdMKo>0F~t^%Biqt z&Q3G7|JIJxN4Q9MFESM3R|e(o`kX%*4W8}k|0U#q0})B%gtWVb-Hr>l^nI;7%ms#= z$j1P*9|Aq-rxVonClr&PP*(&1m_*~NN_}4T2fSW5UmC_BJkzA~M_C!!Ie9eUd=i_J zkJC_|5`U+9tXwNeLXK;`Lop)07tVe8=Tl-mF=z#bZYeiE{7lWU`*Zwh^RW2eIz`$C z==_o}TCF;*JmFH3`l}p@jvMb0ME!vdMU9F^ zfu;v0#SfXqhK8RXo-`G=byX}*JGq@uD7sI{u5Xu}p1wW;wuK9E&>5=HW~$%%9OzE> zhPOqwus5ff4=h z^Jx}XdI*LG2OTtdfi2D)_plDI(N8duj<@&7Xqerie@_z$?#LPses)%U4rG0RA^eqf zpDFFy&K4TGv(mESd0l%6?FbR=fP_57!*dkMEz$I#hr>&SfSdsOhDA%**buBq1iGrK ziP!Za3UwfHKq&my`Z&V|kJYtCB{-V(r|v_2+y{VoCsAdRe>fd$$W8iZ9yjZ5O9gC4;W>ztghV8

    q-+c#yPrgn_Ot%(lBae*tL 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 literal 0 HcmV?d00001 diff --git a/docs/howto/connect_using_odbc_driver.md b/docs/howto/connect_using_odbc_driver.md index 380e54826d..88b7149c64 100644 --- a/docs/howto/connect_using_odbc_driver.md +++ b/docs/howto/connect_using_odbc_driver.md @@ -19,16 +19,15 @@ To download and install the Visual C++ Redistributable for Visual Studio 2013: To download and install the ODBC driver: -1. [Download the TIBCO ComputeDB 1.2.0 Enterprise Version](https://edelivery.tibco.com/storefront/index.ep). The downloaded file contains the TIBCO ComputeDB ODBC driver installers. - -2. Depending on your Windows installation, extract the contents of the 32-bit or 64-bit version of the TIBCO ComputeDB ODBC Driver. +1. Download the drivers zip file **TIB_compute_drivers_1.2.0_linux.zip** using the steps provided [here](/quickstart/getting_started_by_installing_snappydata_on-premise.md). After this file is extracted, you will find that it contains the ODBC installers in another file **TIB_compute-odbc_1.2.0_win.zip**. +2. Extract **TIB_compute-odbc_1.2.0_win.zip**. Depending on your Windows installation, extract the contents of the 32-bit or 64-bit version of the TIBCO ComputeDB ODBC Driver. | Version | ODBC Driver | |--------|--------| |32-bit for 32-bit platform|TIB_compute-odbc_1.2.0_win_x86.zip| |64-bit for 64-bit platform|TIB_compute-odbc_1.2.0_win_x64.zip| -4. Double-click on the extracted **TIB_compute-odbc_1.2.0_win.msi** file, and follow the steps to complete the installation. +4. Double-click on the corresponding **msi** file, and follow the steps to complete the installation. !!! Note Ensure that [TIBCO ComputeDB is installed](../install.md) and the [TIBCO ComputeDB cluster is running](start_snappy_cluster.md). @@ -36,19 +35,12 @@ To download and install the ODBC driver: ## Connecting to the TIBCO ComputeDB Cluster Once you have installed the TIBCO ComputeDB ODBC Driver, you can connect to TIBCO ComputeDB cluster in any of the following ways: -* Use the TIBCO ComputeDB Driver Connection URL: - - Driver=TIBCO ComputeDB ODBC Driver;server=;port=;user=;password=;load-balance=true - - In case you want to connect with a specific server: - - Driver=TIBCO ComputeDB ODBC Driver;server=;port=;user=;password=;load-balance=false - - !!!Note - On the AWS instance, there are issues when you connect with the locator port and address. Therefore,on the AWS instance, it is necessary to provide the load-balance=false property, while connecting to the server. +* Use the TIBCO ComputeDB Driver Connection URL: -* Create a TIBCO ComputeDB DSN (Data Source Name) using the installed TIBCO ComputeDB ODBC Driver. Refer to the Windows documentation relevant to your operating system for more information on creating a DSN.
    -When prompted, select the TIBCO ComputeDB ODBC Driver from the list of drivers and enter a Data Source name. You can then enter either TIBCO ComputeDB Server Host, Port, User Name, and Password or TIBCO ComputeDB Locator Host, Port, User Name and Password. + Driver=TIBCO ComputeDB ODBC Driver;server=;port=;user=;password= + +* Create a TIBCO ComputeDB DSN (Data Source Name) using the installed TIBCO ComputeDB ODBC Driver. Refer to the Windows documentation relevant to your operating system for more information on creating a DSN.
    +When prompted, select the TIBCO ComputeDB ODBC Driver from the list of drivers and enter a Data Source name, TIBCO ComputeDB Server Host, Port, User Name and Password. Refer to the documentation for detailed information on [Setting Up TIBCO ComputeDB ODBC Driver](../setting_up_odbc_driver-tableau_desktop.md). ## Connecting Spotfire® Desktop to TIBCO ComputeDB diff --git a/docs/howto/use_apache_zeppelin_with_snappydata.md b/docs/howto/use_apache_zeppelin_with_snappydata.md index 179ba681df..61e7e13aee 100644 --- a/docs/howto/use_apache_zeppelin_with_snappydata.md +++ b/docs/howto/use_apache_zeppelin_with_snappydata.md @@ -5,11 +5,13 @@ Do the following to use Apache Zeppelin with SnappyData: 1. [Download and Install SnappyData](/install/install_on_premise.md). The install zip for computeDB contains the Apache Zeppelin zip folder. 2. [Configure the SnappyData Cluster](/configuring_cluster/configuring_cluster.md). -3. Unzip the Apache Zeppelin artifact. -4. Change to **Zeppelin** directory and start Zeppelin. - cd Zeppelin directory - ./bin/zeppelin-daemon.sh start -5. Go to localhost:8080 or (AWS-AMI_PublicIP):8080. +3. Unzip the Apache Zeppelin artifact **zeppelin-0.8.2-snappydata-1.2.0.zip**. Change to the directory **zeppelin-0.8.2-snappydata-1.2.0** and start Apache Zeppelin server. + + $ unzip zeppelin-0.8.2-snappydata-1.2.0.zip + $ cd zeppelin-0.8.2-snappydata-1.2.0/ + $ ./bin/zeppelin-daemon.sh start + +5. Enter this URL in the browser: localhost:8080 or (AWS-AMI_PublicIP):8080. ![homepage](../Images/zeppelin.png) @@ -54,7 +56,7 @@ Refer [here](concurrent_apache_zeppelin_access_to_secure_snappydata.md) for inst | SnappyData Zeppelin Interpreter | Apache Zeppelin Binary Package | SnappyData Release| |--------|--------|--------| - |[Version 0.7.3.6](https://github.com/SnappyDataInc/zeppelin-interpreter/releases/tag/v0.7.3.6) |[Version 0.7.3](http://archive.apache.org/dist/zeppelin/zeppelin-0.7.3/zeppelin-0.7.3-bin-netinst.tgz) |[Release 1.1.1](https://edelivery.tibco.com)| + |[Version 0.7.3.6](https://github.com/SnappyDataInc/zeppelin-interpreter/releases/tag/v0.7.3.6) |[Version 0.7.3](http://archive.apache.org/dist/zeppelin/zeppelin-0.7.3/zeppelin-0.7.3-bin-netinst.tgz) |[Release 1.2.0](https://edelivery.tibco.com)| 2. [Configure the SnappyData Cluster](../configuring_cluster/configuring_cluster.md). diff --git a/docs/install/building_from_source.md b/docs/install/building_from_source.md index f65bbc252e..243e052aef 100644 --- a/docs/install/building_from_source.md +++ b/docs/install/building_from_source.md @@ -8,7 +8,7 @@ **Latest release branch** ```pre -> git clone https://github.com/SnappyDataInc/snappydata.git -b branch- --recursive +> git clone https://github.com/SnappyDataInc/snappydata.git -b v --recursive > cd snappydata > ./gradlew product ``` @@ -22,24 +22,6 @@ The product is in **build-artifacts/scala-2.11/snappy** -## Build only the Top-level Components - -Use this option if you want to build only the top-level SnappyData project and pull in jars for other projects (spark, store, spark-jobserver): - -**Latest release branch** -```pre -> git clone https://github.com/SnappyDataInc/snappydata.git -b branch- -> cd snappydata -> ./gradlew product -``` - -**Master** -```pre -> git clone https://github.com/SnappyDataInc/snappydata.git -> cd snappydata -> ./gradlew product -``` - ## Repository Layout - **core** - Extensions to Apache Spark that should not be dependent on SnappyData Spark additions, job server etc. It is also the bridge between _spark_ and _store_ (GemFireXD). For example, SnappyContext, row and column store, streaming additions etc. diff --git a/docs/install/install_on_premise.md b/docs/install/install_on_premise.md index c83133247c..f3817af08a 100644 --- a/docs/install/install_on_premise.md +++ b/docs/install/install_on_premise.md @@ -57,7 +57,7 @@ If all the machines in your cluster can share a path over an NFS or similar prot 2. Extract the downloaded archive file and go to SnappyData home directory. $ tar -xzf snappydata--bin.tar.gz - $ cd snappydata-.-bin/ + $ cd snappydata--bin/ 3. Configure the cluster as described in [Configuring the Cluster](../configuring_cluster/configuring_cluster.md). diff --git a/docs/install/system_requirements.md b/docs/install/system_requirements.md index edef6f2769..08427449d1 100644 --- a/docs/install/system_requirements.md +++ b/docs/install/system_requirements.md @@ -53,7 +53,7 @@ Requirements for each host: * If you deploy SnappyData on a virtualized host, consult the documentation provided with the platform, for system requirements and recommended best practices, for running Java and latency-sensitive workloads. -## VSD Requirements + ## Python Integration using pyspark - The Python pyspark module has the same requirements as in Apache Spark. The numpy package is required by many modules of pyspark including the examples shipped with SnappyData. On recent Red Hat based systems, it can be installed using `sudo yum install numpy` or `sudo yum install python2-numpy` commands. Whereas, on Debian/Ubuntu based systems, you can install using the `sudo apt-get install python-numpy` command. diff --git a/docs/programming_guide/scala_interpreter.md b/docs/programming_guide/scala_interpreter.md index 7db50557f7..602e373bb5 100644 --- a/docs/programming_guide/scala_interpreter.md +++ b/docs/programming_guide/scala_interpreter.md @@ -3,21 +3,22 @@ !!!Note This is an experimental feature in the SnappyData 1.2.0 release. -Prior to the 1.2.0 release, any execution of a Spark scala program required the user to compile his Spark program, comply to specific callback API required by SnappyData, package the classes into a JAR, and then submit the application using **snappy-job **tool. -While, this procedure may still be the right option for a production application, it is quite cumbersome for the developer or data scientist wanting to quickly run some Spark code within the SnappyData store cluster and iterate. +Prior to the 1.2.0 release, any execution of a Spark scala program required the user to compile his Spark program, comply to specific callback API required by ComputeDB, package the classes into a JAR, and then submit the application using **snappy-job** tool. +While, this procedure may still be the right option for a production application, it is quite cumbersome for the developer or data scientist wanting to quickly run some Spark code within the ComputeDB store cluster and iterate. With the introduction of the [**exec scala** SQL command](/reference/sql_reference/exec-scala.md), you can now get a JDBC or ODBC connection to the cluster and submit ad-hoc scala code for execution. The JDBC connection provides an ongoing session with the cluster so applications can maintain state and use/return this across multiple invocations. Beyond this developer productivity appeal, this feature also allows you to skip using the [**Smart Connector**](/affinity_modes/connector_mode.md) in several cases. -Bespoke Spark applications using the smart connector are required to launch a client Spark application with its own executors and the store cluster is mostly providing parallel access to managed data. As the client is running queries this is additional capacity that you must budget. Moreover, the overall architecture is tough to understand. With **exec scala**, any Spark application could submit scala code as an SQL command now. +Bespoke Spark applications using the smart connector are required to launch a client Spark application with its own executors and the store cluster is mostly providing parallel access to managed data. As the client is running queries this is additional capacity that you must budget. Moreover, the overall architecture is tough to understand. +With [**exec scala**](/reference/sql_reference/exec-scala.md), any Spark application can submit scala code as an SQL command now. **Here is one use case that motivated us**: TIBCO data scientists using Team Studio (TIBCO Data Science platform) can now build custom operators, target SnappyData for in-database computations, and run adhoc Spark Scala code. For instance, ETL feature engineering using Spark ML or running a training job in-memory and with parallelism. -Following are some examples to demonstrate the usage through some examples .... +Following are some examples to demonstrate the usage through some examples: ### Example 1: ``` -// Note this is a SQL command... this is the text you would send using a JDBC or ODBC connection +// Note this is an SQL command... this is the text you will send using a JDBC or ODBC connection val prepDataCommand = """ Exec scala @@ -49,25 +50,25 @@ ResultSet rs = conn.createStatement().executeSQL(prepDataCommand) ### Syntax ``` -exec scala [options (returnDF ‘dfName’)] ``k +exec scala [options (returnDF ‘dfName’)] ``; ``` * **exec** and **scala** are the keywords to identify this SQL type. * **options** is an optional part of the syntax. If it is present, then after the keyword **options**, you can specify the allowed options inside parentheses. Currently, only one optional parameter, that is **returnDF**, can be specified with the execution. For this option, you can provide the name of any actual symbol in the Scala code, which is of type DataFrame. -Through the **returnDF** option, you can request the system to return the result of the specific dataframe, which got created as the result of the Scala code execution. By default, the **exec scala** just returns the output of each interpreted line, which the interpreter prints on the Console after executing each line. +Through the **returnDF** option, you can request the system to return the result of the specific dataframe, which got created as the result of the Scala code execution. By default, the [**exec scala**](/reference/sql_reference/exec-scala.md) just returns the output of each interpreted line, which the interpreter prints on the Console after executing each line. ## How does it work? -All the code from **exec scala** is executed using the Scala REPL on the SnappyData Lead node. When Spark Dataframes are invoked this would automatically result in workload distribution across all the SnappyData +All the code from [**exec scala**](/reference/sql_reference/exec-scala.md) is executed using the Scala REPL on the SnappyData Lead node. When Spark Dataframes are invoked this would automatically result in workload distribution across all the SnappyData servers. The Lead node manages a pool of REPL based interpreters. The user SQL activity is delegated to one of the interpreters from this pool. The pool is lazily created. Any connection (JDBC or ODBC) results in the creation of a SnappySession within the CDB cluster. Moreover, the session remains associated with the connection until it is closed or dereferenced. -The first time **exec scala** is executed, an interpreter from the pool gets associated with the connection. This allows the user to manage any adhoc private state on the server side. For example, any variables, objects, or even classes created will be isolated from other users. +The first time [**exec scala**](/reference/sql_reference/exec-scala.md) is executed, an interpreter from the pool gets associated with the connection. This allows the user to manage any adhoc private state on the server side. For example, any variables, objects, or even classes created will be isolated from other users. The functioning of the interpreter is same as that of the interactive [Spark-shell](/programming_guide/using_the_spark_shell_and_spark-submit.md) only with one difference. As commands are interpreted any output generated will be cached in a buffer. And, when the command is done, the cached output will be available in the client side ResultSet object. @@ -76,7 +77,7 @@ The functioning of the interpreter is same as that of the interactive [Spark-she The ability to run Scala code directly on a running cluster can be dangerous. This is because there are no checks on what code you can run. The submitted Scala code is executed on the lead node and has the potential to bring it down. It becomes essential to secure the use of this functionality. -By default, in a secure cluster, only the database owner is allowed to run Scala code through **exec scala** SQL or even through snappy-scala shell. The database owner is the user who brings up the SnappyData cluster. If different credentials are used for different components of the SnappyData cluster, then the credentials with which the lead node is started becomes the database owner for this purpose. Ideally, every node should start with the same superuser credentials. +By default, in a secure cluster, only the database owner is allowed to run Scala code through [**exec scala**](/reference/sql_reference/exec-scala.md) SQL or even through snappy-scala shell. The database owner is the user who brings up the SnappyData cluster. If different credentials are used for different components of the SnappyData cluster, then the credentials with which the lead node is started becomes the database owner for this purpose. Ideally, every node should start with the same superuser credentials. The superuser or the database owner, in turn, can grant the privilege of executing Scala code to other users and even to entire LDAP groups. Similarly, it is only the superuser who can revoke this privilege from any user or LDAP group. @@ -98,87 +99,6 @@ grant privilege exec scala to LDAPGROUP:group1 revoke privilege exec scala from user2,LDAPGROUP:group1 ``` -### More Examples - -The **snappy** CLI, which is also known as the snappy-sql CLI, is commonly used to fire SQL queries interactively into a SnappyData cluster. You can use these command-line tools to fire Scala code as well. - -The following are some examples that show how to use the **exec scala **sql. - -You can start a SnappyData cluster or connect to an already existing one using the snappy/snappy-sql CLI or you can obtain a JDBC/ODBC connection and fire these queries. Following examples were run on the snappy CLI. - -**Example 1** - -``` -## A simple Scala code to define a value x and print it. - -snappy> exec scala val x = 5 - /* This is a test - program */ - // Just see the value of x - println(x); -C0 --------------------------------------------------------------------------------------------------------------------------------- -x: Int = 5 - -5 -``` - -**Example 2** - -``` -## The following Scala code creates a table using the available snappy session. This can be accessed through the symbol ‘snappy’. It then inserts a couple of rows, obtains a dataframe object, and then uses the df.show command. - -snappy> exec scala snappysession.sql("create table t1(c1 int not null)") - /* This is a data frame test */ - // Check the collect output - snappysession.sql("insert into t1 values (1), (2)") - val df = snappysession.table("t1") - val cnt = df.count - df.show; -C0 --------------------------------------------------------------------------------------------------------------------------------- -res4: org.apache.spark.sql.DataFrame = [] - - -res7: org.apache.spark.sql.DataFrame = [count: int] -df: org.apache.spark.sql.DataFrame = [c1: int] -cnt: Long = 2 -+---+ -| c1| -+---+ -| 2| -| 1| -+---+ -``` - -!!!Note - The variable **snappysession** is not declared anywhere; however, the above code uses it. The **snappysession** symbol name is for the object **SnappySession**, which represents this database connection. Similarly, **sc** is there to access the singleton SparkContext present on the lead node. - -**Example 3** - -``` -Declaring a case class and then creating a dataset using it. Also creating another dataset and then getting a dataframe on it. -Note the use of the option **returnDF** here. Through this option, you can request the system to return the result of the specific dataframe we want to which got created as the result of the Scala code execution. Here both **ds1** and **ds2** are created. However, the caller wants the output of the **ds2** and hence specified the symbol **ds2** in the options. By default, the exec scala returns the output of each interpreted line, which the interpreter prints on the Console after executing each line. - -snappy> exec scala options(returnDF 'ds2') case class ClassData(a: String, b: Int) - val sqlContext= new org.apache.spark.sql.SQLContext(sc) - import sqlContext.implicits._ - val ds1 = Seq(("a", 1), ("b", 2), ("c", 3)).toDF("a", "b").as[ClassData] - var rdd = sc.parallelize(Seq(("a", 1), ("b", 2), ("c", 3)), 1) - val ds2 = rdd.toDF("a", "b").as[ClassData]; -a |b --------------------------------------------------------------------------------------------------------------------------------------------- -a |1 -b |2 -c |3 - -3 rows selected - -``` - -!!!Note - The use of the **sc** symbol here in this example. This is the global SparkContext present in the lead node. - ### Known Issues and Limitations An interpreter cannot serialize a dependent closure properly. A dependent closure is the closure that refers to some other class, function, or variable that is defined outside the closure. diff --git a/docs/quickstart/getting_started_by_installing_snappydata_on-premise.md b/docs/quickstart/getting_started_by_installing_snappydata_on-premise.md index 0aa0e20b55..0a515453bb 100644 --- a/docs/quickstart/getting_started_by_installing_snappydata_on-premise.md +++ b/docs/quickstart/getting_started_by_installing_snappydata_on-premise.md @@ -10,6 +10,6 @@ $ mkdir quickstartdatadir $./bin/spark-shell --conf spark.snappydata.store.sys-disk-dir=quickstartdatadir --conf spark.snappydata.store.log-file=quickstartdatadir/quickstart.log ``` - It opens the Spark shell. All TIBCO ComputeDB metadata, as well as persistent data, is stored in the directory **quickstartdatadir**.
    The spark-shell can now be used to work with TIBCO ComputeDB using [SQL](using_sql.md) and [Scala APIs](using_spark_scala_apis.md). +It opens the Spark shell. All SnappyData metadata, as well as persistent data, is stored in the directory **quickstartdatadir**.
    The spark-shell can now be used to work with SnappyData using [SQL](using_sql.md) and [Scala APIs](using_spark_scala_apis.md). -Follow instructions [here](/howto/use_apache_zeppelin_with_snappydata.md), to use the product from Apache Zeppelin. +Follow instructions [here](/howto/use_apache_zeppelin_with_snappydata.md), to use the product from Apache Zeppelin. diff --git a/docs/reference/command_line_utilities/scala-cli.md b/docs/reference/command_line_utilities/scala-cli.md index f5788f4884..5767307cf6 100644 --- a/docs/reference/command_line_utilities/scala-cli.md +++ b/docs/reference/command_line_utilities/scala-cli.md @@ -1,26 +1,94 @@ # snappy-scala CLI -The snappy-scala CLI, which is similar to spark-shell in its capabilities, is introduced as an experimental feature in this release. snappy-scala CLI is built on top of the **exec scala** feature and the already existing snappy CLI utility. This is not a true Scala interpreter but mimics a scala or a spark-shell kind of interpreter. Here, each line of code is shipped to the lead node. The code is interpreted on the lead node. The result is brought back to the snappy-scala shell. +The snappy-scala CLI is introduced as an experimental feature in the SnappyData 1.2.0 release. This is similar to the Spark shell in its capabilities. The [Spark documentation](https://spark.apache.org/docs/2.1.1/quick-start.html) defines the Spark shell as follows: -Features such as auto-complete and full-fledged colon command of a scala shell are not as stable as in the spark-shell. This is because in Apache Spark, the spark-shell is itself the Application driver VM whereas in SnappyData, the driver is the lead node, which is a remote process from the command-line utility point of view. The snappy-scala CLI utility connects like a client utility and therefore has the limitation mentioned above. Those limitations can be overcome and will be considered in a future release. +***Spark’s shell provides a simple way to learn the API, as well as a powerful tool to analyze data interactively. It is available in either Scala (which runs on the Java VM and is thus a good way to use existing Java libraries) or Python.*** + +A developer who is learning the Spark APIs of SparkContext, SparkSession, RDD, DataSet, DataSources, ML, etc. , can use the following utilities: + +* **Spark shell** to quickly bring up an interactive shell and start learning and experimenting with the APIs. +* **PySpark**, provided by spark, for interactive Python where you can interactively learn the Python APIs that are provided by Spark. + +Spark shell is a spark application that is built on Scala’s REPL (Read-Evaluate-Print loop). It accepts Scala code as input, executes the instructions as per the code, and returns the output of those instructions. After this utility is invoked, the spark driver comes into life, in which a SparkContext, a SparkSession, and a REPL object are initialized, and an interactive shell is provided to the users on the driver VM itself for interactive learning. +The high cost, in terms of time and efforts, for each change warranting code compilation and then adding into a jar can be entirely avoided by using the Spark shell. A developer who wants to develop a Spark job can start by writing the code in a Spark shell and improve the job in interactive iterations. After the developer is satisfied with the quality of the code, it can be converted into a Spark Job. + +The idea of snappy-scala CLI is similar to that of Spark shell with few differences. With the snappy-scala CLI, you can interactively learn all the Spark APIs, the additional SnappyData APIs and also have the same experience of a Scala REPL or a Spark shell REPL app. You can still use the Spark shell and connect to a SnappyData cluster in Smart Connector mode, but you will require a separate Spark cluster for that. Moreover, that will be a different experience wherein the SnappyData cluster is used mostly as a DataSource by the Spark application. + +snappy-scala CLI is built on top of the [exec scala](/reference/sql_reference/exec-scala.md) feature and the already existing snappy CLI utility, which connects to the SnappyData cluster using the JDBC driver. snappy-scala CLI is not a true scala interpreter but mimics a scala or a Spark shell type of interpreter. Each line of the code is shipped to the Lead node of the SnappyData cluster. The code is interpreted there, and the result of the interpretation is then brought back to the snappy-scala CLI. It is displayed in the same fashion as that of a Scala REPL. + +Although the experience of the snappy-scala CLI is similar to that of a Scala or a Spark shell, yet a couple of important features are either missing or are thinly supported. This is because it is currently an experimental feature. The following are a couple of notable differences between the Spark shell and snappy-scala CLI: + +* The auto completion feature, which is rich in a true Scala or Scala based interpreter. It is almost as rich as an IDE, where it can prompt possible completions, method signature, word completion, syntaxes, etc. +* Support for the list of commands which can be executed on the shell. + +The following image shows a simple SnappyData cluster, which is started, and then the snappy-scala is launched to connect. + +![Snappyscala](../../Images/snappy-scala_api.png) ### Command-line options ``` $ ./bin/snappy-scala -h + Usage: + snappy-scala [OPTIONS] + OPTIONS and Default values + -c LOCATOR_OR_SERVER_ENDPOINT (default value is localhost:1527) + -u USERNAME (default value is APP) + -p PASSWORD (default value is APP) + -r SCALA_FILE_PATHS (comma separated paths if multiple) + -h, --help (prints script usage) + ``` +The following options are only available currently: + +| Options | Description | +|--------|--------| +| **-c** | The endpoint of the server host port to which the tool connects. If the option is not specified, then the CLI attempts to connect to **localhost:1527** endpoint. | +| **-u ** | The user who wants to start the shell. If the user is trying to connect to a secured SnappyData cluster, then this user will be authenticated by the server. | +| **-p** | Password of the user. | +| ** -r ** | A list of files that can be passed as an argument. The file should contain valid Scala code, which is interpreted line by line by the tool. If there are more than one file to be passed, then the list must be comma-separated. | +| **-h ** | prints the usage of the script.| -As seen above there are 5 ### Securing the Usage of snappy-scala CLI -This is the same as securing the usage of **exec scala**. For more details refer to [Securing the Usage of exec scala SQL](/programming_guide/scala_interpreter.md#secureexscala). +This is the same as [securing the usage of **exec scala**](/programming_guide/scala_interpreter.md#secureexscala). In a secured system, by default, only the DB owner has the permission to secure the usage and can grant this privilege to other users as well. Apart from running the Scala code, the CLI also takes predefined commands. Each of these commands has a specific purpose. All these commands start with a colon **:**. With the help of this, the interpreter differentiates between the code and command. + +On the snappy-scala prompt, type **:help** for the list of supported commands. The following image shows the list of the available commands that are displayed when you type **:help** command: + +![Snappyscala](../../Images/snappy-scala_api_1.png) + +All the commands are listed with their corresponding description when **:help** is typed on the snappy-scala prompt. This is mostly a subset of what Spark shell provides. Some of the missing ones are **:paste**, **:edit**, **:load** etc. There are few commands which are specific to snappy-scala such as **:maximumdisplaywidth**, **:elapsedtime on** etc. The following table lists the commands that are supported by snappy-scala: + +| Commands | Description | +|--------|--------| +| **:help** | Prints the list of all the available commands along with the corresponding descriptions. | +|** :implicits ** | The imported implicits in the session so far. | +| ** :javap** | Decompiles a java class. | +|** :sh ** | Runs a shell command. | +| ** :silent ** | The CLI becomes silent and does not print the output after each execution. | +| **:type** | Prints the type of the Symbol, which is passed in the argument. For example, if **x** is an Int then **:type x** prints **INT** | +| **:kind ** | Prints the kind of the expression type. | +| **:warnings** | Prints any warning in the session. | +| ** :replay ** | Re-runs all the code from the beginning of the session or from the last point of **:reset**. Commands are not replayed. The difference with Spark shell on this command is that with snappy-scala, the replay can be done only once, and the buffer containing the commands is then emptied. In case the command is replayed again without running any code, then a message **Nothing to replay** is displayed. | +| **:reset ** | It resets all the state in the interpreter. All types, symbols, imports, etc. created in the session will be lost. | +|**:history ** | Prints the Scala code that was run in the session. | +|**:run **| Passes a path to the Scala file as an argument to this command. The scala code in the file is executed one by one by the snappy-scala CLI.| + +The following are additional commands provided in the snappy-scala CLI over the Spark shell commands. + +| Command| Description | +|--------|--------| +| **:elapsedtime on ** |Displays the elapsed time of each and every line of code or command which is executed on the interpreter. | +| **:quit**| The session is closed, and you can exit the CLI program.| +|**:maximumdisplaywidth ** | Sets the largest display width of the CLI output to the specified value. Usually, this command is used to increase the default value to display long lines that come in the output. | +|** :maximumlinewidth ** |Same as above. This command sets the largest display width for each line output from the interpreter to the specified value. | diff --git a/docs/reference/configuration_parameters/statistic-sample-rate.md b/docs/reference/configuration_parameters/statistic-sample-rate.md index 736b9e4169..4dc20a36a0 100644 --- a/docs/reference/configuration_parameters/statistic-sample-rate.md +++ b/docs/reference/configuration_parameters/statistic-sample-rate.md @@ -5,8 +5,6 @@ Boot property that specifies how often to sample statistics, in milliseconds.
    Valid values are in the range 1000..60000. -!!! Note - If the value is set to less than 1000, the rate will be set to 1000 because the VSD tool does not support sub-second sampling. ## Default Value diff --git a/docs/reference/sql_reference/exec-scala.md b/docs/reference/sql_reference/exec-scala.md index 0554f544eb..28a45faf67 100644 --- a/docs/reference/sql_reference/exec-scala.md +++ b/docs/reference/sql_reference/exec-scala.md @@ -1,24 +1,26 @@ # exec scala -## Syntax +## Description - exec scala [options (returnDF ‘dfName’)] +**exec scala** is an SQL feature that you can use to submit Scala code to the SnappyData cluster. This is a SQL construct from any JDBC/ODBC client and one of the ways in which you can submit the Scala code to the SnappyData cluster. You can submit a chunk of Scala code similar to a SQL query, which is submitted to a database on a JDBC/ODBC connection including hive thrift server SQL clients such as beeline. -* **exec** and **scala** are the keywords to identify this SQL type. +A parallel between a SQL query and a block of Scala code is brought about by using a fixed schema for the Scala code. Since, a select query's result set metadata is fixed, whereas there is no meaning of a fixed schema for a chunk of Scala code. Therefore, SnappyData provides a fixed schema to all the Scala code. This is elaborated in the following sections. -* **options** is an optional part of the syntax. If it is present, then after the keyword **options**, you can specify the allowed options inside parentheses. Currently, only one optional parameter, that is **returnDF**, can be specified with the execution. For this option, you can provide the name of any actual symbol in the Scala code, which is of type DataFrame. -Through the **returnDF** option, you can request the system to return the result of the specific dataframe, which got created as the result of the Scala code execution. By default, the **exec scala** just returns the output of each interpreted line, which the interpreter prints on the Console after executing each line. +### How Does it Work? -## Description +All the code from **exec scala** is executed using the Scala REPL on the SnappyData Lead node. When Spark Dataframes are invoked this would automatically result in workload distribution across all the SnappyData +servers. The Lead node manages a pool of REPL based interpreters. The user SQL activity is delegated to one of the interpreters from this pool. The pool is lazily created. -**exec scala** is an SQL feature that you can use to submit Scala code to the SnappyData cluster. This is a SQL construct from any JDBC/ODBC client and one of the ways in which you can submit the Scala code to the SnappyData cluster. You can submit a chunk of Scala code similar to a SQL query, which is submitted to a database on a JDBC/ODBC connection including hive thrift server SQL clients such as beeline. +Any connection (JDBC or ODBC) results in the creation of a SnappySession within the CDB cluster. Moreover, the session remains associated with the connection until it is closed or dereferenced. -A parallel between a SQL query and a block of Scala code is brought about by using a fixed schema for the Scala code. Since, a select query's result set metadata is fixed, whereas there is no meaning of a fixed schema for a chunk of Scala code. Therefore, SnappyData provides a fixed schema to all the Scala code. This is elaborated in the following sections. -### Important Information About **exec scala** +The first time **exec scala** is executed, an interpreter from the pool gets associated with the connection. This allows the user to manage any adhoc private state on the server side. For example, any variables, objects, or even classes created will be isolated from other users. +The functioning of the interpreter is same as that of the interactive [Spark-shell](/programming_guide/using_the_spark_shell_and_spark-submit.md) only with one difference. As commands are interpreted any output generated will be cached in a buffer. And, when the command is done, the cached output will be available in the client side ResultSet object. + +### Important Information about **exec scala** - Arbitrary Scala code can be executed through exec scala. -- A SnappySession object and the SparkContext object can be accessed through the Symbol name **snapp** and **sc** in the **exec scala** code. +- A SnappySession object and the SparkContext object can be accessed through the Symbol name **snappysession** and **sc** in the **exec scala** code. - If you are having a loop inside your Scala code, then the output of each loop is not returned after the execution of each loop. The entire execution happens first, and after that, the output is fetched at once. This is unlike the spark-shell. In a spark-shell or Scala shell, the output of each loop execution is printed on the console. - If you run rogue code such as **System.exit** or a divide by 0 scenario, the lead node is bound to crash. The system does not check the code before executing it. - In a non-secured system, anyone can run **exec scala**. @@ -28,23 +30,176 @@ A parallel between a SQL query and a block of Scala code is brought about by usi - By default, the output of this SQL is a single column resultset of type **varchar**. Essentially, whatever the interpreter writes on the console is brought back to the caller/user. - The user can specify the name of the dataframe instead as a return result instead of the default behavior. The symbol should be of a valid existing dataframe symbol in the context of the session. -## Example -A simple Scala code to define a value x and print it. +## Syntax + + exec scala [options (returnDF ‘dfName’)] + +* **exec** and **scala** are the keywords to identify this SQL type. + +* **options** is an optional part of the syntax. If it is present, then after the keyword **options**, you can specify the allowed options inside parentheses. Currently, only one optional parameter, that is **returnDF**, can be specified with the execution. For this option, you can provide the name of any actual symbol in the Scala code, which is of type DataFrame. +Through the **returnDF** option, you can request the system to return the result of the specific dataframe, which got created as the result of the Scala code execution. By default, the **exec scala** just returns the output of each interpreted line, which the interpreter prints on the Console after executing each line. + +
    +## Examples + +### Examples I + +Following are some examples to demonstrate the usage of **exec scala**. You can run these examples using [Snappy shell](../howto/use_snappy_shell.md). + + +* A simple Scala code to define a value **x** and print it. + + exec scala val x = 5 + /* This is a test + program */ + // Just see the value of x + println(x); + C0 + ------------------------------------------------------------------------------------------------------ + x: Int = 5 + + 5 + + +* Create table using the available snappy session, which can be accessed through the variable ‘snappysession’. It then inserts a couple of rows, obtains a dataframe object, and then uses the **df.show** command. + + snappy> exec scala snappysession.sql("create table t1(c1 int not null)") + /* This is a data frame test */ + // Check the collect output + snappysession.sql("insert into t1 values (1), (2)") + val df = snappysession.table("t1") + val cnt = df.count + df.show; + C0 + -------------------------------------------------------------------------------------------------- + res4: org.apache.spark.sql.DataFrame = [] + + res7: org.apache.spark.sql.DataFrame = [count: int] + df: org.apache.spark.sql.DataFrame = [c1: int] + cnt: Long = 2 + +---+ + | c1| + +---+ + | 2| + | 1| + +---+ + + !!!Note + The variable **snappysession** is not declared anywhere; however, the above code uses it. The **snappysession** symbol name is for the object **SnappySession**, which represents this database connection. Similarly, **sc** is there to access the singleton SparkContext present on the lead node. + +### Examples II + +* Executing scala code snippet via JDBC or ODBC connection on to the SnappyData cluster. + + // Note this is an SQL command... this is the text you will send using a JDBC or ODBC connection. + + val prepDataCommand = + """ exec scala + val dataDF = snappysession.read.option("header", "true").csv("../path/to/customers.csv") + // Variable 'snappysession' is injected to your program automatically. + // Refers to a SnappySession instance. + val newDF = dataDF.withColumn("promotion", "$20") + newDF.createOrReplaceTempView("customers") + //OR, store in in-memory table + newDF.write.format("column").saveAsTable("customers") + """ + // Acquire JDBC connection and execute Spark program + Class.forName("io.snappydata.jdbc.ClientDriver") + val conn = DriverManager.getConnection("jdbc:snappydata://localhost:1527/") + conn.createStatement().executeSQL(prepDataCommand) + +* Returning a specific Dataframe using keyword **returnDF**. Note the use of the option **returnDF** here. Through this option, you can request the system to return the result of the specific dataframe you want, which got created as the result of the Scala code execution. + + val getDataFromCDB = + """ exec scala options(returnDF 'someDF') + val someDF = snappysession.table("customers").filter(..... ) + """ + ResultSet rs = conn.createStatement().executeSQL(getDataFromCDB) + //Use JDBC ResultSet API to fetch result. Data types will be mapped automatically + +* Declaring a case class and then creating a dataset using it. Also creating another dataset and then getting a dataframe on it. Note the use of the option **returnDF** here. Through this option, you can request the system to return the result of the specific dataframe you want, which got created as the result of the Scala code execution. +Here both **ds1** and **ds2** are created. However, the caller wants the output of the **ds2** and hence specified the symbol **ds2** in the options. By default, the **exec scala** returns the output of each interpreted line, which the interpreter prints on the console after executing each line. + + exec scala options(returnDF 'ds2') case class ClassData(a: String, b: Int) + val sqlContext= new org.apache.spark.sql.SQLContext(sc) + import sqlContext.implicits._ + val ds1 = Seq(("a", 1), ("b", 2), ("c", 3)).toDF("a", "b").as[ClassData] + var rdd = sc.parallelize(Seq(("a", 1), ("b", 2), ("c", 3)), 1) + val ds2 = rdd.toDF("a", "b").as[ClassData]; + a |b + --------------------------------------------------------------------------- + a |1 + b |2 + c |3 + + 3 rows selected + + + !!!Note + The use of the **sc** symbol here in this example. This is the global SparkContext present in the lead node. + + + +### Securing the Usage of exec scala SQL + +The ability to run Scala code directly on a running cluster can be dangerous. This is because there are no checks on what code you can run. The submitted Scala code is executed on the lead node and has the potential to bring it down. It becomes essential to secure the use of this functionality. + +By default, in a secure cluster, only the database owner is allowed to run Scala code through **exec scala** SQL or even through snappy-scala shell. The database owner is the user who brings up the SnappyData cluster. If different credentials are used for different components of the SnappyData cluster, then the credentials with which the lead node is started becomes the database owner for this purpose. Ideally, every node should start with the same superuser credentials. + +The superuser or the database owner, in turn, can grant the privilege of executing Scala code to other users and even to entire LDAP groups. Similarly, it is only the superuser who can revoke this privilege from any user or LDAP group. + +You can use the following DDL for this purpose: + +**GRANT** + +``` +grant privilege exec scala to +``` + +**Examples** ``` -snappy> exec scala val x = 5 - /* This is a test - program */ - // Just see the value of x - println(x); -C0 --------------------------------------------------------------------------------------------------------------------------------- -x: Int = 5 - -5 +grant privilege exec scala to user1 +revoke privilege exec scala from user1 +grant privilege exec scala to user1,user2 +grant privilege exec scala to LDAPGROUP:group1 +revoke privilege exec scala from user2,LDAPGROUP:group1 ``` +### Known Issues and Limitations +An interpreter cannot serialize a dependent closure properly. A dependent closure is the closure that refers to some other class, function, or variable that is defined outside the closure. +Thus, the following example fails with closure serialization error. +``` +exec scala def multiply(number: Int, factor: Int): Int = { + + number * factor + +} + +val data = Array(1, 2, 3, 4, 5) + +val numbersRdd = sc.parallelize(data, 1) + +val collectedNumbers = numbersRdd.map(multiply(_, 2)).collect() +``` + +The execution of the last line fails as the closure cannot be serialized due to this issue. This is referring to the function **multiply** that is defined outside the closure. + +Similarly, even the following example fails: + +``` + +val x = 5 + +val data = Array(1, 2, 3, 4, 5) + +val numbersRdd = sc.parallelize(data, 1) + +val collectedNumbers = numbersRdd.map(_ * x).collect() +``` +This is because the closure is referring to **x**, which is defined outside the closure. +There are no issues if the closure has no dependency on any external variables. diff --git a/docs/vsd/collecting_system_stats.md b/docs/vsd/collecting_system_stats.md index 7004b04f1a..fa86ba9004 100755 --- a/docs/vsd/collecting_system_stats.md +++ b/docs/vsd/collecting_system_stats.md @@ -33,4 +33,4 @@ These properties can only be used with a peer client connect. !!! Note - Because of the overhead required for taking many timestamps, it is recommended that you enable time-based statistics only during testing and debugging. - - Use statement-level statistics only when the number of individual statements is small, such as when using prepared statements. SnappyData creates a separate statistics instance for each individual statement. With a large number of these statements, it can be difficult to load archives into VSD and navigate to those statistics of interest. + - Use statement-level statistics only when the number of individual statements is small, such as when using prepared statements. SnappyData creates a separate statistics instance for each individual statement. diff --git a/docs/vsd/system_performance.md b/docs/vsd/system_performance.md index cc1e93f90a..fc2684ad68 100755 --- a/docs/vsd/system_performance.md +++ b/docs/vsd/system_performance.md @@ -6,11 +6,7 @@ SnappyData provides statistics for analyzing system performance. Any member of a SnappyData samples statistics at a configurable interval and writes them to an archive. The archives can be read at any time, including at runtime. -You can view and analyze runtime or archived historical data using these tools: - -- `snappy-shell stats` is a command-line tool provided with the SnappyData product. - -- SnappyData [Visual Statistics Display (VSD)](vsd_overview.md) is a graphical tool that is installed in the **vsd** subdirectory of the SnappyData installation. +You can view and analyze runtime or archived historical data using `snappy-shell stats` which is a command-line tool provided with the SnappyData product. !!! Note - SnappyData statistics use the Java System.nanoTimer for nanosecond timing. This method provides nanosecond precision, but not necessarily nanosecond accuracy. For more information, see the online Java documentation for System.nanoTimer for the JRE you are using with SnappyData. @@ -21,7 +17,5 @@ You can view and analyze runtime or archived historical data using these tools: - **[Collecting System Statistics](collecting_system_stats.md)** Enable SnappyData system statistics using a system procedure, member boot properties, or connection properties. -- **[Using VSD to Analyze Statistics](vsd_overview.md)** - The Visual Statistics Display (VSD) reads the sampled statistics from one or more archives and produces graphical displays for analysis. VSD is installed with SnappyData in the tools subdirectory. diff --git a/mkdocs.yml b/mkdocs.yml index 724f366531..0e81bab12b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -158,15 +158,15 @@ pages: - 'Evaluating Statistics for the System and Applications': 'vsd/system_performance.md' - 'Evaluating Statistics for the System and Applications': - 'Collecting System Statistics': 'vsd/collecting_system_stats.md' - - 'Using VSD to Analyze Statistics': 'vsd/vsd_overview.md' - - 'Using VSD to Analyze Statistics': - - 'Installing and Running VSD': 'vsd/running_vsd.md' - - 'Transaction Performance': 'vsd/vsd_transactions.md' - - 'Table Performance': 'vsd/vsd_tables.md' - - 'SQL Statement Performance': 'vsd/vsd_statements.md' - - 'Memory Usage': 'vsd/vsd_memory.md' - - 'Client Connections': 'vsd/vsd-connection-stats.md' - - 'CPU Usage': 'vsd/vsd_cpu.md' +# - 'Using VSD to Analyze Statistics': 'vsd/vsd_overview.md' +# - 'Using VSD to Analyze Statistics': +# - 'Installing and Running VSD': 'vsd/running_vsd.md' +# - 'Transaction Performance': 'vsd/vsd_transactions.md' +# - 'Table Performance': 'vsd/vsd_tables.md' +# - 'SQL Statement Performance': 'vsd/vsd_statements.md' +# - 'Memory Usage': 'vsd/vsd_memory.md' +# - 'Client Connections': 'vsd/vsd-connection-stats.md' +# - 'CPU Usage': 'vsd/vsd_cpu.md' - 'Reference Guides': 'reference.md' - 'Reference Guides': - 'Configuration Reference': 'configuring_cluster/configuring_cluster.md' From 8a3d9577a885359eea22b823447d3f6c629f7b28 Mon Sep 17 00:00:00 2001 From: paresh-p11 <43569032+paresh-p11@users.noreply.github.com> Date: Thu, 13 Feb 2020 16:18:28 +0530 Subject: [PATCH 2/4] Fixing SNAP-3306 (#1529) * Allowing -1 as value for SchemaColumnId, for the case when the column is missing in the schema-version under consideration.This happens when it tries to read older rows, which doesn't have the new column. --- .../io/snappydata/cluster/PrimaryDUnitRecoveryTest.scala | 2 +- .../org/apache/spark/sql/execution/oplog/impl/OpLogRdd.scala | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cluster/src/dunit/scala/io/snappydata/cluster/PrimaryDUnitRecoveryTest.scala b/cluster/src/dunit/scala/io/snappydata/cluster/PrimaryDUnitRecoveryTest.scala index 70c7402bec..d0d0e7e8eb 100644 --- a/cluster/src/dunit/scala/io/snappydata/cluster/PrimaryDUnitRecoveryTest.scala +++ b/cluster/src/dunit/scala/io/snappydata/cluster/PrimaryDUnitRecoveryTest.scala @@ -1688,7 +1688,7 @@ class PrimaryDUnitRecoveryTest(s: String) extends DistributedTestBase(s) stmt.execute(s"ALTER TABLE $fqtn DROP COLUMN c2") stmt.execute(s"DELETE FROM $fqtn WHERE c1 = 2") stmt.execute(s"DELETE FROM $fqtn WHERE c1 = 5") - stmt.execute(s"ALTER TABLE $fqtn ADD COLUMN c2 integer") + stmt.execute(s"ALTER TABLE $fqtn ADD COLUMN c4 integer") stmt.execute(s"INSERT INTO $fqtn VALUES (9, 99, 999)") // 10: null and not null complex types 2 buckets no alter diff --git a/core/src/main/scala/org/apache/spark/sql/execution/oplog/impl/OpLogRdd.scala b/core/src/main/scala/org/apache/spark/sql/execution/oplog/impl/OpLogRdd.scala index 9eec5bf2d9..e86474da3d 100644 --- a/core/src/main/scala/org/apache/spark/sql/execution/oplog/impl/OpLogRdd.scala +++ b/core/src/main/scala/org/apache/spark/sql/execution/oplog/impl/OpLogRdd.scala @@ -168,9 +168,9 @@ class OpLogRdd( } } } - assert(index != -1, s"column id not found for $fqtn.$colName") - tableColIdsMap.getOrElse(s"$version#$fqtnLowerKey", + if (index != -1) tableColIdsMap.getOrElse(s"$version#$fqtnLowerKey", throw new IllegalStateException(s"column ids not found: $version#$fqtnLowerKey"))(index) + else -1 } /** From 467aeaf2abfbbc22efa6021cb21a9ff0ecb3399f Mon Sep 17 00:00:00 2001 From: Supriya Pillai Date: Mon, 17 Feb 2020 14:17:50 +0530 Subject: [PATCH 3/4] Misc cdc test changes -Changed the scripts to have more streaming queries on same table. -Added parameter for re-submitting app after HA. -Added script to delete and truncate the sqlServer table data. -Changed the logging and exception type. --- .../scripts/cdcConnector/bulkDelete.sql | 270 +++++++------ .../cdcConnector/createAndLoadFewTables.sql | 354 ++++++++++++++++-- .../scripts/cdcConnector/insert1.sql | 30 +- .../scripts/cdcConnector/insert2.sql | 27 +- .../scripts/cdcConnector/insert3.sql | 18 + .../scripts/cdcConnector/insert4.sql | 18 + .../scripts/cdcConnector/insert5.sql | 18 + .../cdc_source_connection.properties | 2 +- .../source_destination1.properties | 11 + .../source_destination2.properties | 11 + .../source_destination3.properties | 11 + .../source_destination4.properties | 11 + .../source_destination5.properties | 11 + .../scripts/cdcConnector/tableListTemp.txt | 10 +- .../scripts/cdcConnector/truncateTable.sql | 110 ++++++ .../hydra/cdcConnector/CDCIngestionApp.java | 89 +++-- .../hydra/cdcConnector/CDCPerfSparkJob.java | 2 +- .../hydra/cdcConnector/SnappyCDCPrms.java | 8 + .../hydra/cdcConnector/SnappyCDCTest.java | 31 +- .../cdcConnector/cdcBasicValidationTest.conf | 87 ++++- .../hydra/cdcConnector/cdcConnector.bt | 55 +-- .../hydra/cdcConnector/cdcHATest.conf | 3 +- .../hydra/cluster/SnappyConcurrencyTest.java | 4 +- .../snappydata/hydra/cluster/SnappyTest.java | 4 +- .../hydra/cdcConnector/CDCValidationApp.scala | 74 ++-- 25 files changed, 965 insertions(+), 304 deletions(-) create mode 100644 dtests/src/resources/scripts/cdcConnector/insert3.sql create mode 100644 dtests/src/resources/scripts/cdcConnector/insert4.sql create mode 100644 dtests/src/resources/scripts/cdcConnector/insert5.sql create mode 100644 dtests/src/resources/scripts/cdcConnector/source_destination1.properties create mode 100644 dtests/src/resources/scripts/cdcConnector/source_destination2.properties create mode 100644 dtests/src/resources/scripts/cdcConnector/source_destination3.properties create mode 100644 dtests/src/resources/scripts/cdcConnector/source_destination4.properties create mode 100644 dtests/src/resources/scripts/cdcConnector/source_destination5.properties create mode 100644 dtests/src/resources/scripts/cdcConnector/truncateTable.sql diff --git a/dtests/src/resources/scripts/cdcConnector/bulkDelete.sql b/dtests/src/resources/scripts/cdcConnector/bulkDelete.sql index 43d56486ff..493bfd69d2 100644 --- a/dtests/src/resources/scripts/cdcConnector/bulkDelete.sql +++ b/dtests/src/resources/scripts/cdcConnector/bulkDelete.sql @@ -1,140 +1,130 @@ -DELETE FROM [testdatabase].[dbo].[ADJUSTMENT ] WHERE ADJ_ID > ? ; -DELETE FROM [testdatabase].[dbo].[AGREEMENT ] WHERE AGREE_ID > ? ; -DELETE FROM [testdatabase].[dbo].[BANK ] WHERE BNK_ID > ? ; -DELETE FROM [testdatabase].[dbo].[BANK_ACCOUNT ] WHERE BNK_ACCT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUP_NAME ] WHERE BENE_GRP_NM_ID > ? ; -DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUPS ] WHERE BENE_GRP_ID > ? ; -DELETE FROM [testdatabase].[dbo].[BENEFIT_PACKAGE ] WHERE BENE_PKG_ID > ? ; -DELETE FROM [testdatabase].[dbo].[BENEFIT_PACKAGE_ATTRIBUTE ] WHERE BENE_PKG_ATTR_ID > ?; -DELETE FROM [testdatabase].[dbo].[BENEFIT_PACKAGE_RELATION ] WHERE BENE_PKG_ID > ? ; -DELETE FROM [testdatabase].[dbo].[BILLING_ENTITY ] WHERE BILL_ENT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[BILLING_ENTITY_CONTACT ] WHERE BILL_ENT_CNTC_ID > ? ; -DELETE FROM [testdatabase].[dbo].[BILLING_ENTITY_DETAIL ] WHERE BILL_ENT_ID> ? ; -DELETE FROM [testdatabase].[dbo].[BILLING_ENTITY_SCHEDULE ] WHERE BILL_ENT_SCHD_ID > ? ; -DELETE FROM [testdatabase].[dbo].[BILLING_RECONCILIATION ] WHERE BILL_RECON_ID > ? ; -DELETE FROM [testdatabase].[dbo].[BILLING_SCHEDULE ] WHERE BILL_SCHD_ID > ? ; -DELETE FROM [testdatabase].[dbo].[BILLING_SOURCE ] WHERE BILL_SRC_ID > ?; -DELETE FROM [testdatabase].[dbo].[CHARGE_ITEM ] WHERE CHRG_ITM_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CHECKS ] WHERE CHK_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CHECK_STATUS ] WHERE CHK_STAT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM ] WHERE CLM_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_ADDITIONAL_DIAGNOSIS ] WHERE CLM_ADD_DIAG_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_ATTRIBUTE ] WHERE CLM_ATTR_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_COB ] WHERE CLM_COB_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_COSHARE_TRACKING ] WHERE CLAIM_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_DETAIL ] WHERE CLM_DTL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_HOSPITAL ] WHERE CLM_HOSP_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_LINE_ATTRIBUTE ] WHERE CLM_LN_ATTR_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_PAYMENT ] WHERE CLM_PAY_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_PAYMENT_DETAIL ] WHERE CLM_PAY_DTL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_PAYMENT_REDUCTION ] WHERE CLM_PAY_RDCTN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_REDUCTION_DETAIL ] WHERE CLM_RDCTN_DTL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_REDUCTION_HISTORY ] WHERE CLM_RDCTN_HIST_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLAIM_STATUS ] WHERE CLM_STAT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLIENT_REFERENCE_DATA ] WHERE CLIENT_REF_DTA_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CLIENTS ] WHERE CLIENT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[COB_CLAIM_DIAGNOSIS ] WHERE PRSN_COB_ID > ? ; -DELETE FROM [testdatabase].[dbo].[COB_ORGANIZATION_PERSON ] WHERE PRSN_COB_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CODE_VALUE ] WHERE CD_VAL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[COMMUNICATION ] WHERE CMCN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[COMPLAINT ] WHERE COMPLAINT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[COMPLAINT_STATUS ] WHERE COMPLAINT_STAT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CONTACT ] WHERE CNTC_ID > ? ; -DELETE FROM [testdatabase].[dbo].[CONTACT_TYPE_CONTACT ] WHERE CNTC_TYP_CNTC_ID > ? ; -DELETE FROM [testdatabase].[dbo].[DIAGNOSIS_CODE ] WHERE DIAG_CD_ID > ? ; -DELETE FROM [testdatabase].[dbo].[ELECTRONIC_ADDRESS ] WHERE ELEC_ADDR_ID > ? ; -DELETE FROM [testdatabase].[dbo].[ENTITY_BANK_ACCOUNT ] WHERE ENT_BNK_ACCT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[ETL_METADATA ] WHERE STMT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[EXHIBIT ] WHERE EXHIBIT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[EXHIBIT_GROUP ] WHERE EXHIBIT_GRP_ID > ? ; -DELETE FROM [testdatabase].[dbo].[EXHIBIT_GROUP_EXHIBIT ] WHERE EXHIBIT_GRP_EXHIBIT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[EXPLANATION_CODE ] WHERE EXPLAIN_CD_ID > ? ; -DELETE FROM [testdatabase].[dbo].[FDI_CORRESPONDENCE ] WHERE ENTITY_ID > ? ; -DELETE FROM [testdatabase].[dbo].[FDI_TX_IDCARD ] WHERE ACN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[FDI_TX_LETTER ] WHERE ACN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[FILE_TRANSFER_RUN ] WHERE FL_TRANS_RUN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[FILE_TRANSFER_STAT ] WHERE FL_TRANS_STAT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[GENERAL_LEDGER ] WHERE GL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[GENERAL_LEDGER_MAP ] WHERE GL_MAP_ID > ? ; -DELETE FROM [testdatabase].[dbo].[GROUP_RELATION ] WHERE GRP_RELN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[GROUPS ] WHERE GRP_ID > ? ; -DELETE FROM [testdatabase].[dbo].[INQUIRY ] WHERE INQ_ID > ? ; -DELETE FROM [testdatabase].[dbo].[INVOICE ] WHERE INV_ID > ? ; -DELETE FROM [testdatabase].[dbo].[INVOICE_DETAIL ] WHERE INV_DTL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[INVOICE_STATUS ] WHERE INV_STAT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[LEP_APPEAL ] WHERE LEP_APL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[LEP_APPEAL_DECISION ] WHERE LEP_APL_DEC > ? ; -DELETE FROM [testdatabase].[dbo].[LETTER ] WHERE LTR_ID > ? ; -DELETE FROM [testdatabase].[dbo].[LETTER_DETAIL ] WHERE LTR_DTL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[LETTER_JOB ] WHERE LTR_JOB_ID > ? ; -DELETE FROM [testdatabase].[dbo].[LETTER_REGISTER ] WHERE LTR_RGSTR_ID > ? ; -DELETE FROM [testdatabase].[dbo].[LETTER_WORK_ITEM ] WHERE LTR_WRK_ITM_ID > ? ; -DELETE FROM [testdatabase].[dbo].[LINE_ADDITIONAL_DIAGNOSIS ] WHERE LN_ADD_DIAG_ID > ? ; -DELETE FROM [testdatabase].[dbo].[LINE_DISALLOW_EXPLANATION ] WHERE LN_DISALLOW_EXPLAIN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[LINE_PROCEDURE_MODIFIER ] WHERE LN_PR_MOD_ID > ? ; -DELETE FROM [testdatabase].[dbo].[MARX_CALENDAR ] WHERE MARX_CAL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[MOOP_ACCUMULATOR ] WHERE FAMILY_ID > ? ; -DELETE FROM [testdatabase].[dbo].[MOOP_BALANCE ] WHERE PRSN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[MOOP_BALANCE_EXCEPTIONS ] WHERE MEMBER_ID > ? ; -DELETE FROM [testdatabase].[dbo].[NOTE ] WHERE NTE_ID > ? ; -DELETE FROM [testdatabase].[dbo].[ORGANIZATION_CODE ] WHERE ORG_CD_ID > ? ; -DELETE FROM [testdatabase].[dbo].[ORGANIZATION_CONTACT_TYPE ] WHERE ORG_CNTC_TYP_ID > ? ; -DELETE FROM [testdatabase].[dbo].[ORGANIZATION_EVENT ] WHERE ORG_EVNT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[ORGANIZATIONS ] WHERE ORG_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PAYMENT ] WHERE PAY_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_ACCUMULATOR ] WHERE PRSN_ACCUM_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_COB ] WHERE PRSN_COB_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_CODE ] WHERE PRSN_CD_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_CONTACT ] WHERE PRSN_CNTC_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_EVENT ] WHERE PRSN_EVNT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_EVENT_ATTRIBUTE ] WHERE PRSN_EVNT_ATTR_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_EVENT_STATUS ] WHERE PRSN_EVNT_STAT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_EVENT_STATUS_REASON ] WHERE PRSN_EVNT_STAT_RSN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_LEP_EVENT ] WHERE PRSN_LEP_EVNT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_LEP_PROFILE ] WHERE PRSN_LEP_PRFL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_LEP_PROFILE_RECORD ] WHERE PRSN_LEP_PRFL_REC_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_ORGANIZATION_RELATION ] WHERE PRSN_ORG_RELN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_PAYMENT_OPTIONS ] WHERE PAY_OPTN_REF_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_RELATION ] WHERE PRSN_RELN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_ROLE ] WHERE PRSN_TYP_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_SUBSIDY_PROFILE ] WHERE PRSN_SBSDY_PRFL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSON_WORK_ITEM ] WHERE PRSN_WRK_ITM_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PERSONS ] WHERE PRSN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PHONE ] WHERE PHN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PLAN_MEMBERSHIPS ] WHERE PLAN_MBRSHP_ID > ? ; -DELETE FROM [testdatabase].[dbo].[POS_CODE ] WHERE POS_CD_ID > ? ; -DELETE FROM [testdatabase].[dbo].[POSTAL_ADDRESS ] WHERE PSTL_ADDR_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PREMIUM ] WHERE PREM_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PREMIUM_CATEGORY ] WHERE PREM_CAT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PREMIUM_PART ] WHERE PREM_PART_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PREMIUM_TABLE ] WHERE PREM_TBL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[PROCEDURE_CODE ] WHERE PR_CD_ID > ?; -DELETE FROM [testdatabase].[dbo].[PROCEDURE_PRICE ] WHERE PR_PRC_ID > ? ; -DELETE FROM [testdatabase].[dbo].[RECEIPT ] WHERE RCPT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[REFERENCE_DATA ] WHERE REF_DTA_ID > ? ; -DELETE FROM [testdatabase].[dbo].[RETURNED_MAIL ] WHERE RTRN_MAIL_ID > ? ; -DELETE FROM [testdatabase].[dbo].[REVENUE_CODE ] WHERE REV_CD_ID > ? ; -DELETE FROM [testdatabase].[dbo].[SERVICE_CODE ] WHERE SERV_CD_ID > ? ; -DELETE FROM [testdatabase].[dbo].[SERVICES_ACCOUNTING_CODES ] WHERE ACCOUNTING_CODE_ID > ? ; -DELETE FROM [testdatabase].[dbo].[SERVICES_CLIENT_MASTER ] WHERE CLIENT_REF_ID > ? ; -DELETE FROM [testdatabase].[dbo].[SERVICES_DENIAL_REASON_CONFIG ] WHERE DENIAL_REASON_ID > ? ; -DELETE FROM [testdatabase].[dbo].[SERVICES_DNIS_CONFIG ] WHERE DNIS_ID > ? ; -DELETE FROM [testdatabase].[dbo].[SERVICES_GROUP_CODE_CONFIG ] WHERE GROUP_ID > ? ; -DELETE FROM [testdatabase].[dbo].[SERVICES_KEY_GENERATOR ] WHERE KEY_GEN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[SERVICES_PLAN_CODE_CONFIG ] WHERE PLAN_CODE_ID > ? ; -DELETE FROM [testdatabase].[dbo].[SERVICES_PTMR_VARIABLE_TRANSLATIONS ] WHERE VARIABLE_ID > ? ; -DELETE FROM [testdatabase].[dbo].[SERVICES_SUBJECT_CATEGORY_TRANSLATIONS ] WHERE SUBJ_CAT_ID > ? ; -DELETE FROM [testdatabase].[dbo].[TOPIC ] WHERE TPC_ID > ? ; -DELETE FROM [testdatabase].[dbo].[TOPIC_COMMUNICATION ] WHERE TPC_INQ_ID > ? ; -DELETE FROM [testdatabase].[dbo].[UM_ACTIVITY ] WHERE UM_ACTY_ID > ? ; -DELETE FROM [testdatabase].[dbo].[UM_DIAGNOSIS_LINE ] WHERE UM_DIAG_SET_ID > ? ; -DELETE FROM [testdatabase].[dbo].[UM_DIAGNOSIS_SET ] WHERE UM_DIAG_SET_ID > ? ; -DELETE FROM [testdatabase].[dbo].[UM_INPATIENT ] WHERE UM_RVW_ID > ? ; -DELETE FROM [testdatabase].[dbo].[UM_INPATIENT_REVIEW ] WHERE UM_INPT_RVW_ID > ? ; -DELETE FROM [testdatabase].[dbo].[UM_INPATIENT_STATUS ] WHERE UM_INPT_STAT > ? ; -DELETE FROM [testdatabase].[dbo].[UM_INPATIENT_STAY_LENGTH ] WHERE UM_INPT_STAY_LEN_ID > ? ; -DELETE FROM [testdatabase].[dbo].[UM_REVIEW ] WHERE UM_RVW_ID > ? ; -DELETE FROM [testdatabase].[dbo].[UM_SERVICE ] WHERE UM_SERV_ID > ? ; -DELETE FROM [testdatabase].[dbo].[UM_SERVICE_OVERRIDE ] WHERE UM_SERV_OVRD_ID > ? ; -DELETE FROM [testdatabase].[dbo].[UNAPPLIED_CASH ] WHERE UNAPP_CSH_ID > ? ; -DELETE FROM [testdatabase].[dbo].[WORK_GENERATED_KEYS ] WHERE GEN_KEY_ID > ? ; +DELETE FROM [testdatabase].[dbo].[ADJUSTMENT ] WHERE ADJ_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[AGREEMENT ] WHERE AGREE_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[BANK ] WHERE BNK_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[BANK_ACCOUNT ] WHERE BNK_ACCT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUP_NAME ] WHERE BENE_GRP_NM_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUPS ] WHERE BENE_GRP_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_PACKAGE ] WHERE BENE_PKG_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_PACKAGE_ATTRIBUTE ] WHERE BENE_PKG_ATTR_ID >= ?; +DELETE FROM [testdatabase].[dbo].[BENEFIT_PACKAGE_RELATION ] WHERE BENE_PKG_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[BILLING_ENTITY ] WHERE BILL_ENT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[BILLING_ENTITY_CONTACT ] WHERE BILL_ENT_CNTC_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[BILLING_ENTITY_DETAIL ] WHERE BILL_ENT_ID>= ? ; +DELETE FROM [testdatabase].[dbo].[BILLING_ENTITY_SCHEDULE ] WHERE BILL_ENT_SCHD_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[BILLING_RECONCILIATION ] WHERE BILL_RECON_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[BILLING_SCHEDULE ] WHERE BILL_SCHD_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[BILLING_SOURCE ] WHERE BILL_SRC_ID >= ?; +DELETE FROM [testdatabase].[dbo].[CHARGE_ITEM ] WHERE CHRG_ITM_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CHECKS ] WHERE CHK_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CHECK_STATUS ] WHERE CHK_STAT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM ] WHERE CLM_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_ADDITIONAL_DIAGNOSIS ] WHERE CLM_ADD_DIAG_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_ATTRIBUTE ] WHERE CLM_ATTR_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_COB ] WHERE CLM_COB_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_COSHARE_TRACKING ] WHERE CLAIM_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_DETAIL ] WHERE CLM_DTL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_HOSPITAL ] WHERE CLM_HOSP_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_LINE_ATTRIBUTE ] WHERE CLM_LN_ATTR_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_PAYMENT ] WHERE CLM_PAY_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_PAYMENT_DETAIL ] WHERE CLM_PAY_DTL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_PAYMENT_REDUCTION ] WHERE CLM_PAY_RDCTN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_REDUCTION_DETAIL ] WHERE CLM_RDCTN_DTL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_REDUCTION_HISTORY ] WHERE CLM_RDCTN_HIST_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLAIM_STATUS ] WHERE CLM_STAT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLIENT_REFERENCE_DATA ] WHERE CLIENT_REF_DTA_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CLIENTS ] WHERE CLIENT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[COB_CLAIM_DIAGNOSIS ] WHERE PRSN_COB_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[COB_ORGANIZATION_PERSON ] WHERE PRSN_COB_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CODE_VALUE ] WHERE CD_VAL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[COMMUNICATION ] WHERE CMCN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[COMPLAINT ] WHERE COMPLAINT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[COMPLAINT_STATUS ] WHERE COMPLAINT_STAT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CONTACT ] WHERE CNTC_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[CONTACT_TYPE_CONTACT ] WHERE CNTC_TYP_CNTC_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[DIAGNOSIS_CODE ] WHERE DIAG_CD_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[ELECTRONIC_ADDRESS ] WHERE ELEC_ADDR_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[ENTITY_BANK_ACCOUNT ] WHERE ENT_BNK_ACCT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[ETL_METADATA ] WHERE STMT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[EXHIBIT ] WHERE EXHIBIT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[EXHIBIT_GROUP ] WHERE EXHIBIT_GRP_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[EXHIBIT_GROUP_EXHIBIT ] WHERE EXHIBIT_GRP_EXHIBIT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[EXPLANATION_CODE ] WHERE EXPLAIN_CD_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[FDI_CORRESPONDENCE ] WHERE ENTITY_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[FDI_TX_IDCARD ] WHERE ACN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[FDI_TX_LETTER ] WHERE ACN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[FILE_TRANSFER_RUN ] WHERE FL_TRANS_RUN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[FILE_TRANSFER_STAT ] WHERE FL_TRANS_STAT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[GENERAL_LEDGER ] WHERE GL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[GENERAL_LEDGER_MAP ] WHERE GL_MAP_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[GROUP_RELATION ] WHERE GRP_RELN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[GROUPS ] WHERE GRP_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[INQUIRY ] WHERE INQ_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[INVOICE ] WHERE INV_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[INVOICE_DETAIL ] WHERE INV_DTL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[INVOICE_STATUS ] WHERE INV_STAT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[LEP_APPEAL ] WHERE LEP_APL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[LEP_APPEAL_DECISION ] WHERE LEP_APL_DEC >= ? ; +DELETE FROM [testdatabase].[dbo].[LETTER ] WHERE LTR_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[LETTER_DETAIL ] WHERE LTR_DTL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[LETTER_JOB ] WHERE LTR_JOB_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[LETTER_REGISTER ] WHERE LTR_RGSTR_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[LETTER_WORK_ITEM ] WHERE LTR_WRK_ITM_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[LINE_ADDITIONAL_DIAGNOSIS ] WHERE LN_ADD_DIAG_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[LINE_DISALLOW_EXPLANATION ] WHERE LN_DISALLOW_EXPLAIN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[LINE_PROCEDURE_MODIFIER ] WHERE LN_PR_MOD_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[MARX_CALENDAR ] WHERE MARX_CAL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[MOOP_ACCUMULATOR ] WHERE FAMILY_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[MOOP_BALANCE ] WHERE PRSN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[MOOP_BALANCE_EXCEPTIONS ] WHERE MEMBER_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[NOTE ] WHERE NTE_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[ORGANIZATION_CODE ] WHERE ORG_CD_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[ORGANIZATION_CONTACT_TYPE ] WHERE ORG_CNTC_TYP_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[ORGANIZATION_EVENT ] WHERE ORG_EVNT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[ORGANIZATIONS ] WHERE ORG_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PAYMENT ] WHERE PAY_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_ACCUMULATOR ] WHERE PRSN_ACCUM_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_COB ] WHERE PRSN_COB_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_CODE ] WHERE PRSN_CD_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_CONTACT ] WHERE PRSN_CNTC_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_EVENT ] WHERE PRSN_EVNT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_EVENT_ATTRIBUTE ] WHERE PRSN_EVNT_ATTR_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_EVENT_STATUS ] WHERE PRSN_EVNT_STAT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_EVENT_STATUS_REASON ] WHERE PRSN_EVNT_STAT_RSN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_LEP_EVENT ] WHERE PRSN_LEP_EVNT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_LEP_PROFILE ] WHERE PRSN_LEP_PRFL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_LEP_PROFILE_RECORD ] WHERE PRSN_LEP_PRFL_REC_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_ORGANIZATION_RELATION ] WHERE PRSN_ORG_RELN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_PAYMENT_OPTIONS ] WHERE PAY_OPTN_REF_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_RELATION ] WHERE PRSN_RELN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_ROLE ] WHERE PRSN_TYP_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_SUBSIDY_PROFILE ] WHERE PRSN_SBSDY_PRFL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSON_WORK_ITEM ] WHERE PRSN_WRK_ITM_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PERSONS ] WHERE PRSN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PHONE ] WHERE PHN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PLAN_MEMBERSHIPS ] WHERE PLAN_MBRSHP_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[POS_CODE ] WHERE POS_CD_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[POSTAL_ADDRESS ] WHERE PSTL_ADDR_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PREMIUM ] WHERE PREM_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PREMIUM_CATEGORY ] WHERE PREM_CAT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PREMIUM_PART ] WHERE PREM_PART_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PREMIUM_TABLE ] WHERE PREM_TBL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[PROCEDURE_CODE ] WHERE PR_CD_ID >= ?; +DELETE FROM [testdatabase].[dbo].[PROCEDURE_PRICE ] WHERE PR_PRC_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[RECEIPT ] WHERE RCPT_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[REFERENCE_DATA ] WHERE REF_DTA_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[RETURNED_MAIL ] WHERE RTRN_MAIL_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[REVENUE_CODE ] WHERE REV_CD_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[TOPIC ] WHERE TPC_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[TOPIC_COMMUNICATION ] WHERE TPC_INQ_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[UM_ACTIVITY ] WHERE UM_ACTY_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[UM_DIAGNOSIS_LINE ] WHERE UM_DIAG_SET_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[UM_DIAGNOSIS_SET ] WHERE UM_DIAG_SET_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[UM_INPATIENT ] WHERE UM_RVW_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[UM_INPATIENT_REVIEW ] WHERE UM_INPT_RVW_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[UM_INPATIENT_STATUS ] WHERE UM_INPT_STAT >= ? ; +DELETE FROM [testdatabase].[dbo].[UM_INPATIENT_STAY_LENGTH ] WHERE UM_INPT_STAY_LEN_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[UM_REVIEW ] WHERE UM_RVW_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[UM_SERVICE ] WHERE UM_SERV_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[UM_SERVICE_OVERRIDE ] WHERE UM_SERV_OVRD_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[UNAPPLIED_CASH ] WHERE UNAPP_CSH_ID >= ? ; +DELETE FROM [testdatabase].[dbo].[WORK_GENERATED_KEYS ] WHERE GEN_KEY_ID >= ? ; diff --git a/dtests/src/resources/scripts/cdcConnector/createAndLoadFewTables.sql b/dtests/src/resources/scripts/cdcConnector/createAndLoadFewTables.sql index 11008a8991..8bcca1cadd 100644 --- a/dtests/src/resources/scripts/cdcConnector/createAndLoadFewTables.sql +++ b/dtests/src/resources/scripts/cdcConnector/createAndLoadFewTables.sql @@ -1,42 +1,345 @@ -DROP TABLE IF EXISTS ADJUSTMENT; -DROP TABLE IF EXISTS staging_ADJUSTMENT; ------ CREATE TEMPORARY STAGING TABLE TO LOAD CSV FORMATTED DATA ----- -CREATE EXTERNAL TABLE staging_ADJUSTMENT - USING com.databricks.spark.csv OPTIONS (path ':dataLocation/ADJUSTMENT.dat', header 'true', inferSchema 'true', nullValue 'NULL', maxCharsPerColumn '4096'); -CREATE TABLE ADJUSTMENT USING column OPTIONS(partition_by 'BILL_ENT_ID',buckets '32',key_columns 'CLIENT_ID,BILL_ENT_ID,ADJ_ID ' ) AS (SELECT * FROM staging_ADJUSTMENT); + DROP TABLE IF EXISTS CLAIM; + DROP TABLE IF EXISTS staging_CLAIM; + CREATE EXTERNAL TABLE staging_CLAIM + USING com.databricks.spark.csv OPTIONS (path ':dataLocation/CLAIM.dat', header 'true', inferSchema 'false', nullValue 'NULL', maxCharsPerColumn '4096'); + CREATE TABLE CLAIM ( + PRSN_ID BIGINT NOT NULL, + CLM_ID BIGINT NOT NULL, + VER BIGINT NOT NULL, + CLIENT_ID BIGINT NOT NULL, + SUBS_ID BIGINT, + SERVICING_PRVD_ID BIGINT NOT NULL, + BENE_GRP_ID BIGINT, + CLM_TYP_REF_ID BIGINT NOT NULL, + CLM_SUB_TYP_REF_ID BIGINT NOT NULL, + CLM_RCV_DT DATE, + CLM_INP_DT DATE, + LAST_ACT_TS DATE, + CLM_PD_DT DATE, + NXT_RVW_DT DATE, + SERV_FRM_DT DATE, + SERV_TO_DT DATE, + PAYEE_PRVD_ID BIGINT, + CLM_RLS_IND VARCHAR(200), + CUR_ILLNESS_DT DATE, + SIMILLAR_ILLNESS_DT DATE, + PCP_ID BIGINT, + REFNG_PRVD_ID BIGINT, + PRE_AUTH_NUM VARCHAR(200), + PAY_CALC_DT DATE, + CLM_AI_EOB_IND VARCHAR(200), + EXPLAIN_CD_ID BIGINT, + IMG_ADDR VARCHAR(200), + UNABLE_TO_WRK_FRM DATE, + UNABLE_TO_WRK_TO DATE, + HOSP_FRM DATE, + HOSP_TO DATE, + LAB_SVIND VARCHAR(200), + MDCR_RE_SUBM_NUM VARCHAR(200), + OUT_OF_AREA_IND VARCHAR(200), + XRAY_IND VARCHAR(200), + CLM_RECORDS_IND VARCHAR(200), + CLM_PROC_DT DATE, + CRTD_FRM_CLM_ID BIGINT, + ADJ_TO_CLM_ID BIGINT, + ADJ_FRM_CLM_ID BIGINT, + NTWK_PRVD_ENT_PRFX VARCHAR(200), + NTWK_PRVD_PRFX VARCHAR(200), + NTWK_PRVD_CAP_PRFX VARCHAR(200), + NON_PARTIC_PRVD_PRFX VARCHAR(200), + SERV_DEF_PRFX VARCHAR(200), + PRVD_ACCUM_PRFX VARCHAR(200), + PRCS_CTRL_AGNT_PRFX VARCHAR(200), + MOD_PRC_RULES_PRFX VARCHAR(200), + PRVD_NTWK_ID VARCHAR(200), + PRVD_AGREE_ID VARCHAR(200), + MDCR_ASSIGN_IND VARCHAR(200), + PAY_PRVD_IND VARCHAR(200), + OTH_BENE_IND VARCHAR(200), + ACDT_IND VARCHAR(200), + ACDT_ST VARCHAR(200), + ACDT_DT DATE, + ACDT_AMT NUMERIC(38,8), + PTNT_ACCT_NUM VARCHAR(200), + PTNT_PD_AMT NUMERIC(38,8), + CLM_TOT_CHRG NUMERIC(38,8), + CLM_TOT_PAY NUMERIC(38,8), + CHK_CYCLE_OVRD_IND VARCHAR(200), + CLM_INP_METHOD VARCHAR(200), + CLM_AUD_IND VARCHAR(200), + EXT_REF_IND VARCHAR(200), + VLD_FRM_DT DATE NOT NULL, + VLD_TO_DT DATE, + SRC_SYS_REF_ID VARCHAR(10) NOT NULL, + SRC_SYS_REC_ID VARCHAR(150) + ) USING column OPTIONS(partition_by 'PRSN_ID', buckets '32',key_columns 'CLIENT_ID,PRSN_ID,CLM_ID ' ); + INSERT INTO CLAIM (SELECT * from staging_CLAIM); + DROP TABLE IF EXISTS AGREEMENT; DROP TABLE IF EXISTS staging_AGREEMENT; - ----- CREATE TEMPORARY STAGING TABLE TO LOAD CSV FORMATTED DATA ----- CREATE EXTERNAL TABLE staging_AGREEMENT - USING com.databricks.spark.csv OPTIONS (path ':dataLocation/AGREEMENT.dat', header 'true', inferSchema 'true', nullValue 'NULL', maxCharsPerColumn '4096'); - CREATE TABLE AGREEMENT USING column OPTIONS(partition_by 'AGREE_ID', buckets '32',key_columns 'CLIENT_ID,AGREE_ID ' ) AS (SELECT * FROM staging_AGREEMENT); + USING com.databricks.spark.csv OPTIONS (path ':dataLocation/AGREEMENT.dat', header 'true', inferSchema 'false', nullValue 'NULL', maxCharsPerColumn '4096'); + CREATE TABLE AGREEMENT(AGREE_ID BIGINT NOT NULL, + VER BIGINT NOT NULL, + CLIENT_ID BIGINT NOT NULL, + AGREE_CD VARCHAR(200), + DESCR VARCHAR(200), + EFF_DT DATE, + EXPR_DT DATE, + VLD_FRM_DT TIMESTAMP NOT NULL, + VLD_TO_DT TIMESTAMP, + SRC_SYS_REF_ID VARCHAR(200) NOT NULL, + SRC_SYS_REC_ID VARCHAR(200)) USING column OPTIONS(partition_by 'AGREE_ID', buckets '32',key_columns 'CLIENT_ID,AGREE_ID ' ); + INSERT INTO AGREEMENT (SELECT * FROM staging_AGREEMENT); DROP TABLE IF EXISTS BANK; DROP TABLE IF EXISTS staging_BANK; - ----- CREATE TEMPORARY STAGING TABLE TO LOAD CSV FORMATTED DATA ----- CREATE EXTERNAL TABLE staging_BANK - USING com.databricks.spark.csv OPTIONS (path ':dataLocation/BANK.dat', header 'true', inferSchema 'true', nullValue 'NULL', maxCharsPerColumn '4096'); - CREATE TABLE BANK USING column OPTIONS(partition_by 'BNK_ORG_ID', buckets '32',key_columns 'CLIENT_ID,BNK_ORG_ID,BNK_ID ' ) AS (SELECT * FROM staging_BANK); + USING com.databricks.spark.csv OPTIONS (path ':dataLocation/BANK.dat', header 'true', inferSchema 'false', nullValue 'NULL', maxCharsPerColumn '4096'); + CREATE TABLE BANK(BNK_ORG_ID BIGINT NOT NULL, + BNK_ID BIGINT NOT NULL, + VER BIGINT NOT NULL, + CLIENT_ID BIGINT NOT NULL, + BNK_FULL_NM VARCHAR(50), + RTNG_NUM VARCHAR(35) NOT NULL, + VLD_FRM_DT TIMESTAMP NOT NULL, + VLD_TO_DT TIMESTAMP, + SRC_SYS_REF_ID VARCHAR(10) NOT NULL, + SRC_SYS_REC_ID VARCHAR(150)) USING column OPTIONS(partition_by 'BNK_ORG_ID', buckets '32',key_columns 'CLIENT_ID,BNK_ORG_ID,BNK_ID ' ); + INSERT INTO BANK (SELECT * FROM staging_BANK); DROP TABLE IF EXISTS BENEFIT_PACKAGE; DROP TABLE IF EXISTS staging_BENEFIT_PACKAGE; CREATE EXTERNAL TABLE IF NOT EXISTS staging_BENEFIT_PACKAGE - USING com.databricks.spark.csv OPTIONS (path ':dataLocation/BENEFIT_PACKAGE.dat', header 'true', inferSchema 'true', nullValue 'NULL', maxCharsPerColumn '4096'); - CREATE TABLE IF NOT EXISTS BENEFIT_PACKAGE USING column OPTIONS(partition_by 'BENE_PKG_ID',redundancy '1', buckets '32',key_columns 'CLIENT_ID,BENE_PKG_ID' ) AS (SELECT * FROM staging_BENEFIT_PACKAGE); + USING com.databricks.spark.csv OPTIONS (path ':dataLocation/BENEFIT_PACKAGE.dat', header 'true', inferSchema 'false', nullValue 'NULL', maxCharsPerColumn '4096'); + CREATE TABLE IF NOT EXISTS BENEFIT_PACKAGE(BENE_PKG_ID BIGINT NOT NULL, + VER BIGINT NOT NULL, + CLIENT_ID BIGINT NOT NULL, + BENE_PKG_CD VARCHAR(20) NOT NULL, + BENE_PKG_TYP_REF_ID BIGINT NOT NULL, + ORG_ID BIGINT, + EFF_DT DATE, + EXPR_DT DATE, + VLD_FRM_DT TIMESTAMP NOT NULL, + VLD_TO_DT TIMESTAMP, + SRC_SYS_REF_ID VARCHAR(10) NOT NULL, + SRC_SYS_REC_ID VARCHAR(150)) USING column OPTIONS(partition_by 'BENE_PKG_ID',redundancy '1', buckets '32',key_columns 'CLIENT_ID,BENE_PKG_ID' ); + INSERT INTO BENEFIT_PACKAGE (SELECT * FROM staging_BENEFIT_PACKAGE); + + DROP TABLE IF EXISTS CODE_VALUE; +DROP TABLE IF EXISTS staging_CODE_VALUE; +CREATE EXTERNAL TABLE IF NOT EXISTS staging_CODE_VALUE + USING com.databricks.spark.csv OPTIONS (path ':dataLocation/CODE_VALUE.dat', header 'true', inferSchema 'false', nullValue 'NULL', maxCharsPerColumn '4096'); +CREATE TABLE IF NOT EXISTS CODE_VALUE(CD_VAL_ID BIGINT NOT NULL, + VER BIGINT NOT NULL, + CLIENT_ID BIGINT NOT NULL, + CD_VAL VARCHAR(50) NOT NULL, + CD_TYP_REF_ID BIGINT NOT NULL, + SRC_SYS_REF_ID VARCHAR(10) NOT NULL, + SRC_SYS_REC_ID VARCHAR(150), + VLD_FRM_DT TIMESTAMP NOT NULL, + VLD_TO_DT TIMESTAMP) USING column OPTIONS(partition_by 'CD_VAL_ID', redundancy '1',buckets '32',key_columns 'CLIENT_ID,CD_VAL_ID'); + INSERT INTO CODE_VALUE (SELECT * FROM staging_CODE_VALUE); + +DROP TABLE IF EXISTS GROUPS; +DROP TABLE IF EXISTS staging_GROUPS; +CREATE EXTERNAL TABLE IF NOT EXISTS staging_GROUPS + USING com.databricks.spark.csv OPTIONS (path ':dataLocation/GROUPS.dat', header 'true', inferSchema 'false', nullValue 'NULL', maxCharsPerColumn '4096'); +CREATE TABLE IF NOT EXISTS GROUPS(GRP_ID BIGINT NOT NULL, + VER BIGINT NOT NULL, + CLIENT_ID BIGINT NOT NULL, + GRP_CD VARCHAR(20), + GRP_TYP_REF_ID BIGINT NOT NULL, + ORG_ID BIGINT, + EFF_DT DATE, + EXPR_DT DATE, + VLD_FRM_DT TIMESTAMP NOT NULL, + VLD_TO_DT TIMESTAMP, + SRC_SYS_REF_ID VARCHAR(10) NOT NULL, + SRC_SYS_REC_ID VARCHAR(150)) USING column OPTIONS(partition_by 'GRP_ID',redundancy '1', buckets '32',key_columns 'CLIENT_ID,GRP_ID' ); + INSERT INTO GROUPS (SELECT * FROM staging_GROUPS); + + +DROP TABLE IF EXISTS PERSON_EVENT; +DROP TABLE IF EXISTS staging_PERSON_EVENT; +CREATE EXTERNAL TABLE IF NOT EXISTS staging_PERSON_EVENT + USING com.databricks.spark.csv OPTIONS (path ':dataLocation/PERSON_EVENT.dat', header 'true', inferSchema 'false', nullValue 'NULL', maxCharsPerColumn '4096'); +CREATE TABLE IF NOT EXISTS PERSON_EVENT(PRSN_EVNT_ID BIGINT NOT NULL, + VER BIGINT NOT NULL, + CLIENT_ID BIGINT NOT NULL, + SRC_TYP_ID BIGINT NOT NULL, + PRSN_ID BIGINT, + ATTACH_SRC_ID BIGINT, + EVNT_TYP_REF_ID BIGINT NOT NULL, + CLIENT_EVNT_TYP_REF_ID BIGINT, + EVNT_DESCR VARCHAR(200), + EFF_DT DATE, + EXPR_DT DATE, + VLD_FRM_DT TIMESTAMP NOT NULL, + VLD_TO_DT TIMESTAMP, + SRC_SYS_REF_ID VARCHAR(200) NOT NULL, + SRC_SYS_REC_ID VARCHAR(200) NOT NULL) USING column OPTIONS(partition_by 'PRSN_EVNT_ID', redundancy '1',buckets '32',key_columns 'CLIENT_ID,PRSN_EVNT_ID ' ); +INSERT INTO PERSON_EVENT (SELECT * FROM staging_PERSON_EVENT); - DROP TABLE IF EXISTS BANK_ACCOUNT; - DROP TABLE IF EXISTS staging_BANK_ACCOUNT; +DROP TABLE IF EXISTS TOPIC_COMMUNICATION; +DROP TABLE IF EXISTS staging_TOPIC_COMMUNICATION; +CREATE EXTERNAL TABLE IF NOT EXISTS staging_TOPIC_COMMUNICATION + USING com.databricks.spark.csv OPTIONS (path ':dataLocation/TOPIC_COMMUNICATION.dat', header 'true', inferSchema 'false', nullValue 'NULL', maxCharsPerColumn '4096'); +CREATE TABLE IF NOT EXISTS TOPIC_COMMUNICATION(CMCN_INQ_ID BIGINT NOT NULL, + TPC_INQ_ID BIGINT NOT NULL, + CMCN_ID BIGINT NOT NULL, + TPC_ID BIGINT NOT NULL, + VER BIGINT NOT NULL, + CLIENT_ID BIGINT NOT NULL, + INSRT_USR VARCHAR(50), + UPD_USR VARCHAR(50), + INSRT_SERV_REC_TS TIMESTAMP, + UPD_SERV_REC_TS TIMESTAMP, + VLD_FRM_DT TIMESTAMP NOT NULL, + VLD_TO_DT TIMESTAMP, + SRC_SYS_REF_ID VARCHAR(10) NOT NULL, + SRC_SYS_REC_ID VARCHAR(150)) USING column OPTIONS(partition_by 'CMCN_INQ_ID',redundancy '1', buckets '32',key_columns ' CLIENT_ID,CMCN_INQ_ID,TPC_INQ_ID,CMCN_ID,TPC_ID' ); + INSERT INTO TOPIC_COMMUNICATION (SELECT * FROM staging_TOPIC_COMMUNICATION); + +DROP TABLE IF EXISTS TOPIC; +DROP TABLE IF EXISTS staging_TOPIC; +CREATE EXTERNAL TABLE IF NOT EXISTS staging_TOPIC + USING com.databricks.spark.csv OPTIONS (path ':dataLocation/TOPIC.dat', header 'true', inferSchema 'false', nullValue 'NULL', maxCharsPerColumn '4096'); +CREATE TABLE IF NOT EXISTS TOPIC(INQ_ID BIGINT NOT NULL, + TPC_ID BIGINT NOT NULL, + VER BIGINT NOT NULL, + CLIENT_ID BIGINT NOT NULL, + CASE_ID VARCHAR(20), + TPC_STAT_REF_ID BIGINT NOT NULL, + TPC_SUB_TYP_REF_ID BIGINT NOT NULL, + TPC_TYP_REF_ID BIGINT NOT NULL, + PRSN_ID BIGINT, + DESCR VARCHAR(200), + DTL_DESCR VARCHAR(200), + END_TM TIMESTAMP, + STRT_TM TIMESTAMP, + WRK_BASKET VARCHAR(50), + VLD_FRM_DT TIMESTAMP NOT NULL, + INSRT_USR VARCHAR(50), + UPD_USR VARCHAR(50), + INSRT_SERV_REC_TS TIMESTAMP, + UPD_SERV_REC_TS TIMESTAMP, + VLD_TO_DT TIMESTAMP, + SRC_SYS_REF_ID VARCHAR(10) NOT NULL, + SRC_SYS_REC_ID VARCHAR(150)) USING column OPTIONS(partition_by 'INQ_ID',buckets '32',redundancy '1',key_columns 'CLIENT_ID,INQ_ID,TPC_ID ' ); + INSERT INTO TOPIC (SELECT * FROM staging_TOPIC); + + DROP TABLE IF EXISTS UM_SERVICE; + DROP TABLE IF EXISTS staging_UM_SERVICE; ----- CREATE TEMPORARY STAGING TABLE TO LOAD CSV FORMATTED DATA ----- - CREATE EXTERNAL TABLE IF NOT EXISTS staging_BANK_ACCOUNT - USING com.databricks.spark.csv OPTIONS (path ':dataLocation/BANK_ACCOUNT.dat', header 'true', inferSchema 'true', nullValue 'NULL', maxCharsPerColumn '4096'); - CREATE TABLE IF NOT EXISTS BANK_ACCOUNT USING column OPTIONS(partition_by 'BNK_ORG_ID',redundancy '1', buckets '32',key_columns 'CLIENT_ID,BNK_ORG_ID,BNK_ID,BNK_ACCT_ID' ) AS (SELECT * FROM staging_BANK_ACCOUNT); + CREATE EXTERNAL TABLE IF NOT EXISTS staging_UM_SERVICE + USING com.databricks.spark.csv OPTIONS (path ':dataFilesLocationCol/UM_SERVICE.dat', header 'true', inferSchema 'false', nullValue 'NULL', maxCharsPerColumn '4096'); + CREATE TABLE IF NOT EXISTS UM_SERVICE( + UM_RVW_ID BIGINT NOT NULL, + UM_SERV_ID BIGINT NOT NULL, + VER BIGINT NOT NULL, + CLIENT_ID BIGINT NOT NULL, + SEQ_NUM INTEGER, + PRSN_ID BIGINT, + PRE_AUTH_IND VARCHAR(200), + REF_IND VARCHAR(200), + SERV_TYP VARCHAR(200), + SERV_CAT VARCHAR(200), + USR_ID VARCHAR(200), + CRT_DT DATE, + RCV_DT DATE, + NXT_RVW_DT DATE, + AUTH_DT DATE, + SERV_STAT_CD VARCHAR(200), + SERV_STAT_DT DATE, + STAT_SEQ_NUM INTEGER, + SERV_FRM_DT DATE, + SERV_TO_DT DATE, + REQUESTING_PRVD_ID BIGINT, + SRVC_PRVD_ID BIGINT, + FACIL_PRVD_ID BIGINT, + PCP_PRVD_ID BIGINT, + MED_RLS_IND VARCHAR(200), + DIAG_CD_ID BIGINT, + RLTD_DIAG_CD_ID BIGINT, + SBMT_RLTD_DIAG_CD_ID BIGINT, + SBMT_DIAG_CD_ID BIGINT, + RQST_POS_CD_ID BIGINT, + AUTH_POS_CD_ID BIGINT, + POS_RSN_REFERENSE_ID BIGINT, + OUT_OF_AREA_IND VARCHAR(200), + REFERAL_TYP_REF_ID BIGINT, + SERV_CD VARCHAR(200), + SERV_RULE_CD VARCHAR(200), + SERV_PRC_CD VARCHAR(200), + SERV_GRP_CD VARCHAR(200), + PR_CD_ID BIGINT, + RQST_UNT INTEGER, + AUTH_UNT INTEGER, + UNT_DIFFER_RESON_REF_ID BIGINT, + RQST_CHRG NUMERIC(14,2), + CONTR_AMT NUMERIC(14,2), + NEGOTIATE_AMT NUMERIC(14,2), + NEGOTIATE_PCT NUMERIC(14,2), + FEE_RSN_REF_ID BIGINT, + PRC_AMT NUMERIC(14,2), + PRC_EXPLAIN_ID BIGINT, + DISALLOW_EXPLAIN_ID BIGINT, + SERV_DENIAL_RSN_REF_ID BIGINT, + DENIAL_USR_ID VARCHAR(200), + AUTH_SVIND VARCHAR(200), + AUTH_PR_IND VARCHAR(200), + AUTH_DIAG_IND VARCHAR(200), + AUTH_PRVD_IND VARCHAR(200), + CASE_MGMT_SVIND VARCHAR(200), + CASE_MGMT_PR_IND VARCHAR(200), + CASE_MGMT_DIAG_IND VARCHAR(200), + PRD_VIO_IND VARCHAR(200), + PRD_VIO_RSN_REF_ID BIGINT, + COMPL_IND VARCHAR(200), + COMPL_VIO_RSN_REF_ID BIGINT, + ASST_SURG_IND_1 VARCHAR(200), + RQST_SEC_OPN_IND VARCHAR(200), + OBTAINED_SEC_OPN_IND VARCHAR(200), + ASST_SURG_IND_2 VARCHAR(200), + INP_USR_SITE_CD VARCHAR(200), + PCP_IND VARCHAR(200), + ALWD_AMT NUMERIC(14,2), + ALWD_UNT INTEGER, + USE_AMT NUMERIC(14,2), + USE_UNT INTEGER, + DENIAL_DT DATE, + PROVIDER_NETWORK_ID BIGINT, + PRVD_NTWK_ID VARCHAR(200), + PRVD_AGREE_ID VARCHAR(200), + CLIN_EDIT_IND VARCHAR(200), + CLIN_EDIT_TYP VARCHAR(200), + CLIN_EDIT_FMT_IND VARCHAR(200), + CLIN_EDIT_SEQ_NUM INTEGER, + CALLER_TYP_REF_ID BIGINT, + ASST_SURG_RSN_REF_ID BIGINT, + MICROFILM_ID VARCHAR(200), + PAY_AREA_IND VARCHAR(200), + SERV_AREA_IND VARCHAR(200), + RISK_DELEGATED_IND VARCHAR(200), + RISK_DELEGATED_ENT_ID VARCHAR(200), + CLM_DELEGATED_IND VARCHAR(200), + CLM_DELEGATED_ENT_ID VARCHAR(200), + UM_DELEGATED_IND VARCHAR(200), + UM_DELEGATED_ENT_ID VARCHAR(200), + VLD_FRM_DT DATE NOT NULL, + VLD_TO_DT DATE, + SRC_SYS_REF_ID VARCHAR(200) NOT NULL, + SRC_SYS_REC_ID VARCHAR(200), + OPRN VARCHAR(200) + ) USING column OPTIONS(partition_by 'UM_RVW_ID',redundancy '1',buckets '32',key_columns 'CLIENT_ID,UM_RVW_ID,UM_SERV_ID ' ) AS (SELECT * FROM staging_UM_SERVICE); + INSERT INTO UM_SERVICE (SELECT * FROM staging_UM_SERVICE); DROP TABLE IF EXISTS BENEFIT_GROUP_NAME; DROP TABLE IF EXISTS staging_BENEFIT_GROUP_NAME; - ----- CREATE TEMPORARY STAGING TABLE TO LOAD CSV FORMATTED DATA ----- CREATE EXTERNAL TABLE IF NOT EXISTS staging_BENEFIT_GROUP_NAME - USING com.databricks.spark.csv OPTIONS (path ':dataLocation/BENEFIT_GROUP_NAME.dat', header 'true', inferSchema 'true', nullValue 'NULL', maxCharsPerColumn '4096'); + USING com.databricks.spark.csv OPTIONS (path ':dataLocation/BENEFIT_GROUP_NAME.dat', header 'true', inferSchema 'false', nullValue 'NULL', maxCharsPerColumn '4096'); CREATE TABLE IF NOT EXISTS BENEFIT_GROUP_NAME( GRP_ID BIGINT NOT NULL, BENE_GRP_ID BIGINT NOT NULL, @@ -54,13 +357,12 @@ CREATE TABLE ADJUSTMENT USING column OPTIONS(partition_by 'BILL_ENT_ID',buckets PRIMARY KEY (CLIENT_ID,GRP_ID,BENE_GRP_ID,BENE_GRP_NM_ID) ) USING row OPTIONS(partition_by 'GRP_ID', buckets '32',redundancy '1'); - INSERT INTO BENEFIT_GROUP_NAME SELECT * FROM staging_BENEFIT_GROUP_NAME; + INSERT INTO BENEFIT_GROUP_NAME SELECT * FROM staging_BENEFIT_GROUP_NAME; DROP TABLE IF EXISTS BENEFIT_GROUPS; DROP TABLE IF EXISTS staging_BENEFIT_GROUPS; - ----- CREATE TEMPORARY STAGING TABLE TO LOAD CSV FORMATTED DATA ----- CREATE EXTERNAL TABLE IF NOT EXISTS staging_BENEFIT_GROUPS - USING com.databricks.spark.csv OPTIONS (path ':dataLocation/BENEFIT_GROUPS.dat', header 'true', inferSchema 'true', nullValue 'NULL', maxCharsPerColumn '4096'); + USING com.databricks.spark.csv OPTIONS (path ':dataLocation/BENEFIT_GROUPS.dat', header 'true', inferSchema 'false', nullValue 'NULL', maxCharsPerColumn '4096'); CREATE TABLE IF NOT EXISTS BENEFIT_GROUPS( GRP_ID BIGINT NOT NULL, BENE_PKG_ID BIGINT NOT NULL, @@ -77,4 +379,6 @@ CREATE TABLE ADJUSTMENT USING column OPTIONS(partition_by 'BILL_ENT_ID',buckets PRIMARY KEY (CLIENT_ID,GRP_ID,BENE_PKG_ID,BENE_GRP_ID) ) USING row OPTIONS(partition_by 'GRP_ID', buckets '32',redundancy '1'); - INSERT INTO BENEFIT_GROUPS SELECT * FROM staging_BENEFIT_GROUPS; \ No newline at end of file + INSERT INTO BENEFIT_GROUPS SELECT * FROM staging_BENEFIT_GROUPS; + + diff --git a/dtests/src/resources/scripts/cdcConnector/insert1.sql b/dtests/src/resources/scripts/cdcConnector/insert1.sql index 0d8f089cee..7657c9daa7 100644 --- a/dtests/src/resources/scripts/cdcConnector/insert1.sql +++ b/dtests/src/resources/scripts/cdcConnector/insert1.sql @@ -1,6 +1,24 @@ -INSERT INTO [testdatabase20G].[dbo].[ADJUSTMENT] VALUES (912, ?, 9929, 1, 506161, 775324, 431703, 28440200.7189, N'iT', N'2016-05-09', 520989, 966723, 592283, 682854, 165363, N'2016-07-02', N'2016-05-30', N'889', N'89'); -INSERT INTO [testdatabase20G].[dbo].[AGREEMENT] VALUES (?, 8093, 1, N'PagOvRDn', N'PYydIsuL', N'2016-05-02', N'2016-07-13', N'2016-06-25', N'2016-07-04', N'4027', N'4065'); -INSERT INTO [testdatabase20G].[dbo].[BANK] VALUES (9989, ?, 2391, 1, N'l', N'NAHJCqkFeaAaqJhG', N'2016-07-14', N'2016-06-26', N'4097', N'9092'); -INSERT INTO [testdatabase20G].[dbo].[BANK_ACCOUNT] VALUES (9989, 49596, ?, 1455, 1, N'whr', N'Dd', 148697, N'2016-08-04', N'2016-05-29', N'3789', N'542'); -INSERT INTO [testdatabase20G].[dbo].[BENEFIT_GROUP_NAME] VALUES (14511, 534885, ?, 4440, 1, N'zUXTmYf', N'zaT', N'2016-07-31', N'2016-05-09', N'2016-05-15', N'2016-07-16', N'2367', N'523'); -INSERT INTO [testdatabase20G].[dbo].[BENEFIT_GROUPS] VALUES (8252, 87633, ?, 187253, 1, N'czK', N'2016-05-14', N'2016-05-20', N'2016-07-13', N'2016-07-15', N'VTC', N'FFvhKp'); \ No newline at end of file +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[AGREEMENT1] VALUES (?, 1093, 1, N'PagOvRDn', N'PYydIsuL', N'2016-05-02', N'2016-07-13', N'2016-06-25', N'2016-07-04', N'4027', N'4065'); +INSERT INTO [testdatabase].[dbo].[BANK1] VALUES (1189, ?, 1191, 1, N'l', N'NAHJCqkFeaAaqJhG', N'2016-07-14', N'2016-06-26', N'4097', N'9092'); +UPDATE top(100) [testdatabase].[dbo].[BANK1] set ver = ?; +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[BENEFIT_GROUP_NAME1] VALUES (11511, 111885, ?, 1110, 1, N'zUXTmYf', N'zaT', N'2016-07-31', N'2016-05-09', N'2016-05-15', N'2016-07-16', N'2367', N'523'); +INSERT INTO [testdatabase].[dbo].[BENEFIT_GROUPS1] VALUES (1152, 11633, ?, 111253, 1, N'czK', N'2016-05-14', N'2016-05-20', N'2016-07-13', N'2016-07-15', N'VTC', N'FFvhKp'); +INSERT INTO [testdatabase].[dbo].[BENEFIT_PACKAGE1] VALUES (?, 6113, 1, N'rI', 266, 149398, N'2016-05-11', N'2016-06-25', N'2016-06-03', N'2016-05-09', N'2344', N'9024'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[PERSON_EVENT1] VALUES (?, 1011, 1, 11117540, 11026, 11187528, 11121151, 11119478, N'LhSu', N'2016-06-27', N'2016-05-01', N'2016-05-01', N'2016-07-05', N'8615', N'1915'); +UPDATE top(200) [testdatabase].[dbo].[PERSON_EVENT1] set ver = ?; +INSERT INTO [testdatabase].[dbo].[GROUPS1] VALUES (?, 1197, 1, N'N', 11115, 11160, N'2016-06-10', N'2016-07-31', N'2016-06-12', N'2016-06-11', N'3416', N'3558'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[CODE_VALUE1] VALUES (?, 1109, 1, N'QHD', 111055, N'5665', N'3534', N'2016-06-01', N'2016-07-07'); +INSERT INTO [testdatabase].[dbo].[TOPIC_COMMUNICATION1] VALUES (12144, ?,12144,42111, 1233, 1, N'NJeu', N'hKdqx', N'2016-07-29', N'2016-06-18', N'2016-07-30', N'2016-05-05', N'6335', N'7602'); +DELETE FROM [testdatabase].[dbo].[TOPIC_COMMUNICATION1] WHERE TPC_INQ_ID = ?; +UPDATE top(50) [testdatabase].[dbo].[CODE_VALUE1] set ver = ?; +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[CLAIM1] VALUES (1158, ?, 1179, 1, 1114790, 1114879, 1168623, 1171474, 1111803, N'2016-05-04', N'2016-05-09', N'2016-05-13', N'2016-06-17', N'2016-08-02', N'2016-06-19', N'2016-08-04', 4329838, N'DeKkqx', N'2016-06-23', N'2016-06-27', 8478483, 9135373, N'Opaokf', N'2016-05-07', N'YCUt', 9899536, N'fGbZ', N'2016-07-01', N'2016-05-30', N'2016-06-01', N'2016-07-15', N'Qvlqbr', N'FRmQ', N'Xpry', N'rICNjm', N'vlfFJVD', N'2016-06-02', 2866252, 7617610, 3975782, N'DUKcb', N'kEjAkq', N'MflPF', N'cdxDl', N'JBmf', N'gaPb', N'UZqeLu', N'zftqlV', N'hemXo', N'BoTsuPl', N'nJOIS', N'Owzx', N'jQ', N'Yli', N'uMK', N'2016-05-23', 47416072549968.7945463940, N'dijcR', 60624773348075.8621218470, 279084747.4637000000, 88522.7469420000, N'vJDAlE', N'aNmJ', N'IAna', N'VvYMhQ', N'2016-05-13', N'2016-06-04', N'1897', N'6982'); +commit transaction; \ No newline at end of file diff --git a/dtests/src/resources/scripts/cdcConnector/insert2.sql b/dtests/src/resources/scripts/cdcConnector/insert2.sql index 3a89e85cac..f21d052749 100644 --- a/dtests/src/resources/scripts/cdcConnector/insert2.sql +++ b/dtests/src/resources/scripts/cdcConnector/insert2.sql @@ -1,6 +1,21 @@ -INSERT INTO [testdatabase20G].[dbo].[ADJUSTMENT] VALUES (912, ?, 9929,2, 506161, 775324, 431703, 28440200.7189, N'iT', N'2016-05-09', 520989, 966723, 592283, 682854, 165363, N'2016-07-02', N'2016-05-30', N'889', N'89'); -INSERT INTO [testdatabase20G].[dbo].[AGREEMENT] VALUES (?, 8093, 2, N'PagOvRDn', N'PYydIsuL', N'2016-05-02', N'2016-07-13', N'2016-06-25', N'2016-07-04', N'4027', N'4065'); -INSERT INTO [testdatabase20G].[dbo].[BANK] VALUES (9989, ?, 2391, 2, N'l', N'NAHJCqkFeaAaqJhG', N'2016-07-14', N'2016-06-26', N'4097', N'9092'); -INSERT INTO [testdatabase20G].[dbo].[BANK_ACCOUNT] VALUES (9989, 49596, ?, 1455, 2, N'whr', N'Dd', 148697, N'2016-08-04', N'2016-05-29', N'3789', N'542'); -INSERT INTO [testdatabase20G].[dbo].[BENEFIT_GROUP_NAME] VALUES (14511, 534885, ?, 4440, 2, N'zUXTmYf', N'zaT', N'2016-07-31', N'2016-05-09', N'2016-05-15', N'2016-07-16', N'2367', N'523'); -INSERT INTO [testdatabase20G].[dbo].[BENEFIT_GROUPS] VALUES (8252, 87633, ?, 187253, 2, N'czK', N'2016-05-14', N'2016-05-20', N'2016-07-13', N'2016-07-15', N'VTC', N'FFvhKp'); \ No newline at end of file +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[AGREEMENT2] VALUES (?, 2293, 2, N'PagOvRDn', N'PYydIsuL', N'2016-05-02', N'2016-07-13', N'2016-06-25', N'2016-07-04', N'4027', N'4065'); +INSERT INTO [testdatabase].[dbo].[BANK2] VALUES (9289, ?, 2292, 2, N'l', N'NAHJCqkFeaAaqJhG', N'2016-07-14', N'2016-06-26', N'4097', N'9092'); +DELETE FROM [testdatabase].[dbo].[AGREEMENT2] WHERE AGREE_ID = ? +UPDATE top(200) [testdatabase].[dbo].[AGREEMENT2] set ver = ?; +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[BENEFIT_GROUP_NAME2] VALUES (14511, 22885, ?, 4220, 2, N'zUXTmYf', N'zaT', N'2016-07-31', N'2016-05-09', N'2016-05-15', N'2016-07-16', N'2367', N'523'); +INSERT INTO [testdatabase].[dbo].[BENEFIT_GROUPS2] VALUES (8222, 2233, ?, 122253, 2, N'czK', N'2016-05-14', N'2016-05-20', N'2016-07-13', N'2016-07-15', N'VTC', N'FFvhKp'); +INSERT INTO [testdatabase].[dbo].[BENEFIT_PACKAGE2] VALUES (?, 2223, 2, N'rI', 266, 14298, N'2016-05-11', N'2016-06-25', N'2016-06-03', N'2016-05-09', N'2344', N'9024'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[PERSON_EVENT2] VALUES (?, 3033, 2, 4222220, 99026, 2227528, 47621151, 14959478, N'LhSu', N'2016-06-27', N'2016-05-01', N'2016-05-01', N'2016-07-05', N'8615', N'1915'); +INSERT INTO [testdatabase].[dbo].[GROUPS2] VALUES (?, 5397, 2, N'N', 3225, 22960, N'2016-06-10', N'2016-07-31', N'2016-06-12', N'2016-06-11', N'3416', N'3558'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[CLAIM2] VALUES (2258, ?, 2279, 2, 2224790, 2224879, 2268623, 2271474, 2222803, N'2016-05-04', N'2016-05-09', N'2016-05-13', N'2016-06-17', N'2016-08-02', N'2016-06-19', N'2016-08-04', 4329838, N'DeKkqx', N'2016-06-23', N'2016-06-27', 8478483, 9135373, N'Opaokf', N'2016-05-07', N'YCUt', 9899536, N'fGbZ', N'2016-07-01', N'2016-05-30', N'2016-06-01', N'2016-07-15', N'Qvlqbr', N'FRmQ', N'Xpry', N'rICNjm', N'vlfFJVD', N'2016-06-02', 2866252, 7617610, 3975782, N'DUKcb', N'kEjAkq', N'MflPF', N'cdxDl', N'JBmf', N'gaPb', N'UZqeLu', N'zftqlV', N'hemXo', N'BoTsuPl', N'nJOIS', N'Owzx', N'jQ', N'Yli', N'uMK', N'2016-05-23', 47416072549968.7945463940, N'dijcR', 60624773348075.8621218470, 279084747.4637000000, 88522.7469420000, N'vJDAlE', N'aNmJ', N'IAna', N'VvYMhQ', N'2016-05-13', N'2016-06-04', N'1897', N'6982'); +INSERT INTO [testdatabase].[dbo].[CODE_VALUE2] VALUES (?, 5222, 2, N'QHD', 22055, N'5665', N'3534', N'2016-06-01', N'2016-07-07'); +INSERT INTO [testdatabase].[dbo].[TOPIC_COMMUNICATION2] VALUES (22224, ?,2322,42222, 6233, 2, N'NJeu', N'hKdqx', N'2016-07-29', N'2016-06-18', N'2016-07-30', N'2016-05-05', N'6335', N'7602'); +UPDATE top(200) [testdatabase].[dbo].[TOPIC_COMMUNICATION2] set ver = ?; +commit transaction; diff --git a/dtests/src/resources/scripts/cdcConnector/insert3.sql b/dtests/src/resources/scripts/cdcConnector/insert3.sql new file mode 100644 index 0000000000..c5645af72e --- /dev/null +++ b/dtests/src/resources/scripts/cdcConnector/insert3.sql @@ -0,0 +1,18 @@ +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[AGREEMENT3] VALUES (?, 8333, 3, N'PagOvRDn', N'PYydIsuL', N'2016-05-02', N'2016-07-13', N'2016-06-25', N'2016-07-04', N'4027', N'4065'); +INSERT INTO [testdatabase].[dbo].[BANK3] VALUES (9989, ?, 2333, 3, N'l', N'NAHJCqkFeaAaqJhG', N'2016-07-14', N'2016-06-26', N'4097', N'9092'); +INSERT INTO [testdatabase].[dbo].[CLAIM3] VALUES (3358, ?, 3379, 3, 3334790, 3334879, 3368623, 3371474, 333803, N'2016-05-04', N'2016-05-09', N'2016-05-13', N'2016-06-17', N'2016-08-02', N'2016-06-19', N'2016-08-04', 4329838, N'DeKkqx', N'2016-06-23', N'2016-06-27', 8478483, 9135373, N'Opaokf', N'2016-05-07', N'YCUt', 9899536, N'fGbZ', N'2016-07-01', N'2016-05-30', N'2016-06-01', N'2016-07-15', N'Qvlqbr', N'FRmQ', N'Xpry', N'rICNjm', N'vlfFJVD', N'2016-06-02', 2866252, 7617610, 3975782, N'DUKcb', N'kEjAkq', N'MflPF', N'cdxDl', N'JBmf', N'gaPb', N'UZqeLu', N'zftqlV', N'hemXo', N'BoTsuPl', N'nJOIS', N'Owzx', N'jQ', N'Yli', N'uMK', N'2016-05-23', 47416072549968.7945463940, N'dijcR', 60624773348075.8621218470, 279084747.4637000000, 88522.7469420000, N'vJDAlE', N'aNmJ', N'IAna', N'VvYMhQ', N'2016-05-13', N'2016-06-04', N'1897', N'6982'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[BENEFIT_GROUP_NAME3] VALUES (14533, 534335, ?, 3330, 3, N'zUXTmYf', N'zaT', N'2016-07-31', N'2016-05-09', N'2016-05-15', N'2016-07-16', N'2367', N'523'); +INSERT INTO [testdatabase].[dbo].[BENEFIT_GROUPS3] VALUES (8252, 87333, ?, 187333, 3, N'czK', N'2016-05-14', N'2016-05-20', N'2016-07-13', N'2016-07-15', N'VTC', N'FFvhKp'); +INSERT INTO [testdatabase].[dbo].[BENEFIT_PACKAGE3] VALUES (?, 6733, 3, N'rI', 333, 149398, N'2016-05-11', N'2016-06-25', N'2016-06-03', N'2016-05-09', N'2344', N'9024'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[PERSON_EVENT3] VALUES (?, 3033, 3, 3357540, 33026, 57987528, 47621151, 14959478, N'LhSu', N'2016-06-27', N'2016-05-01', N'2016-05-01', N'2016-07-05', N'8615', N'1915'); +INSERT INTO [testdatabase].[dbo].[GROUPS3] VALUES (?, 3397, 3, N'N', 38335, 33360, N'2016-06-10', N'2016-07-31', N'2016-06-12', N'2016-06-11', N'3416', N'3558'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[CODE_VALUE3] VALUES (?, 3309, 3, N'QHD', 233355, N'5665', N'3534', N'2016-06-01', N'2016-07-07'); +INSERT INTO [testdatabase].[dbo].[TOPIC_COMMUNICATION3] VALUES (33334, ?,33344,33111, 6333, 3, N'NJeu', N'hKdqx', N'2016-07-29', N'2016-06-18', N'2016-07-30', N'2016-05-05', N'6335', N'7602'); +commit transaction; diff --git a/dtests/src/resources/scripts/cdcConnector/insert4.sql b/dtests/src/resources/scripts/cdcConnector/insert4.sql new file mode 100644 index 0000000000..f7858bcccf --- /dev/null +++ b/dtests/src/resources/scripts/cdcConnector/insert4.sql @@ -0,0 +1,18 @@ +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[AGREEMENT4] VALUES (?, 4043, 4, N'PagOvRDn', N'PYydIsuL', N'2016-05-02', N'2016-07-13', N'2016-06-25', N'2016-07-04', N'4027', N'4065'); +INSERT INTO [testdatabase].[dbo].[BANK4] VALUES (4489, ?, 4441, 4, N'l', N'NAHJCqkFeaAaqJhG', N'2016-07-14', N'2016-06-26', N'4097', N'9092'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[BENEFIT_GROUP_NAME4] VALUES (44544, 444885, ?, 4440, 4, N'zUXTmYf', N'zaT', N'2016-07-31', N'2016-05-09', N'2016-05-15', N'2016-07-16', N'2367', N'523'); +INSERT INTO [testdatabase].[dbo].[BENEFIT_GROUPS4] VALUES (4452, 444633, ?, 444253, 4, N'czK', N'2016-05-14', N'2016-05-20', N'2016-07-13', N'2016-07-15', N'VTC', N'FFvhKp'); +INSERT INTO [testdatabase].[dbo].[BENEFIT_PACKAGE4] VALUES (?, 4443, 4, N'rI', 446, 444498, N'2016-05-11', N'2016-06-25', N'2016-06-03', N'2016-05-09', N'2344', N'9024'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[PERSON_EVENT4] VALUES (?, 4433, 4, 44447540, 44026, 57987528, 47621151, 14959478, N'LhSu', N'2016-06-27', N'2016-05-01', N'2016-05-01', N'2016-07-05', N'8615', N'1915'); +INSERT INTO [testdatabase].[dbo].[GROUPS4] VALUES (?, 4447, 4, N'N', 38115, 39960, N'2016-06-10', N'2016-07-31', N'2016-06-12', N'2016-06-11', N'3416', N'3558'); +INSERT INTO [testdatabase].[dbo].[CLAIM4] VALUES (4458, ?, 4479, 4, 4444790, 444879, 4468623, 4471474, 4444803, N'2016-05-04', N'2016-05-09', N'2016-05-13', N'2016-06-17', N'2016-08-02', N'2016-06-19', N'2016-08-04', 4329838, N'DeKkqx', N'2016-06-23', N'2016-06-27', 8478483, 9135373, N'Opaokf', N'2016-05-07', N'YCUt', 9899536, N'fGbZ', N'2016-07-01', N'2016-05-30', N'2016-06-01', N'2016-07-15', N'Qvlqbr', N'FRmQ', N'Xpry', N'rICNjm', N'vlfFJVD', N'2016-06-02', 2866252, 7617610, 3975782, N'DUKcb', N'kEjAkq', N'MflPF', N'cdxDl', N'JBmf', N'gaPb', N'UZqeLu', N'zftqlV', N'hemXo', N'BoTsuPl', N'nJOIS', N'Owzx', N'jQ', N'Yli', N'uMK', N'2016-05-23', 47416072549968.7945463940, N'dijcR', 60624773348075.8621218470, 279084747.4637000000, 88522.7469420000, N'vJDAlE', N'aNmJ', N'IAna', N'VvYMhQ', N'2016-05-13', N'2016-06-04', N'1897', N'6982'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[CODE_VALUE4] VALUES (?, 4449, 4, N'QHD', 444055, N'5665', N'3534', N'2016-06-01', N'2016-07-07'); +INSERT INTO [testdatabase].[dbo].[TOPIC_COMMUNICATION4] VALUES (2444, ?,44244,44411, 6443, 4, N'NJeu', N'hKdqx', N'2016-07-29', N'2016-06-18', N'2016-07-30', N'2016-05-05', N'6335', N'7602'); +commit transaction; diff --git a/dtests/src/resources/scripts/cdcConnector/insert5.sql b/dtests/src/resources/scripts/cdcConnector/insert5.sql new file mode 100644 index 0000000000..9462c0f5c7 --- /dev/null +++ b/dtests/src/resources/scripts/cdcConnector/insert5.sql @@ -0,0 +1,18 @@ +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[AGREEMENT5] VALUES (?, 5553, 5, N'PagOvRDn', N'PYydIsuL', N'2016-05-02', N'2016-07-13', N'2016-06-25', N'2016-07-04', N'4027', N'4065'); +INSERT INTO [testdatabase].[dbo].[BANK5] VALUES (5589, ?, 5591, 5, N'l', N'NAHJCqkFeaAaqJhG', N'2016-07-14', N'2016-06-26', N'4097', N'9092'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[BENEFIT_GROUP_NAME5] VALUES (55511, 555885, ?, 5550, 5, N'zUXTmYf', N'zaT', N'2016-07-31', N'2016-05-09', N'2016-05-15', N'2016-07-16', N'2367', N'523'); +INSERT INTO [testdatabase].[dbo].[BENEFIT_GROUPS5] VALUES (5552, 55533, ?, 555253, 5, N'czK', N'2016-05-14', N'2016-05-20', N'2016-07-13', N'2016-07-15', N'VTC', N'FFvhKp'); +INSERT INTO [testdatabase].[dbo].[BENEFIT_PACKAGE5] VALUES (?, 5553, 5, N'rI', 566, 155598, N'2016-05-11', N'2016-06-25', N'2016-06-03', N'2016-05-09', N'2344', N'9024'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[PERSON_EVENT5] VALUES (?, 5055, 5, 45557540, 55026, 57987528, 47621151, 14959478, N'LhSu', N'2016-06-27', N'2016-05-01', N'2016-05-01', N'2016-07-05', N'8615', N'1915'); +INSERT INTO [testdatabase].[dbo].[GROUPS5] VALUES (?, 5555, 5, N'N', 55515, 35560, N'2016-06-10', N'2016-07-31', N'2016-06-12', N'2016-06-11', N'3416', N'3558'); +commit transaction; +SET XACT_ABORT ON begin transaction; +INSERT INTO [testdatabase].[dbo].[CODE_VALUE5] VALUES (?, 5559, 5, N'QHD', 55055, N'5665', N'3534', N'2016-06-01', N'2016-07-07'); +INSERT INTO [testdatabase].[dbo].[TOPIC_COMMUNICATION5] VALUES (25554, ?,55244,55111, 5533, 5, N'NJeu', N'hKdqx', N'2016-07-29', N'2016-06-18', N'2016-07-30', N'2016-05-05', N'6335', N'7602'); +INSERT INTO [testdatabase].[dbo].[CLAIM5] VALUES (5558, ?, 5579, 5, 5554790, 5554879, 5568623, 5571474, 5555803, N'2016-05-04', N'2016-05-09', N'2016-05-13', N'2016-06-17', N'2016-08-02', N'2016-06-19', N'2016-08-04', 4329838, N'DeKkqx', N'2016-06-23', N'2016-06-27', 8478483, 9135373, N'Opaokf', N'2016-05-07', N'YCUt', 9899536, N'fGbZ', N'2016-07-01', N'2016-05-30', N'2016-06-01', N'2016-07-15', N'Qvlqbr', N'FRmQ', N'Xpry', N'rICNjm', N'vlfFJVD', N'2016-06-02', 2866252, 7617610, 3975782, N'DUKcb', N'kEjAkq', N'MflPF', N'cdxDl', N'JBmf', N'gaPb', N'UZqeLu', N'zftqlV', N'hemXo', N'BoTsuPl', N'nJOIS', N'Owzx', N'jQ', N'Yli', N'uMK', N'2016-05-23', 47416072549968.7945463940, N'dijcR', 60624773348075.8621218470, 279084747.4637000000, 88522.7469420000, N'vJDAlE', N'aNmJ', N'IAna', N'VvYMhQ', N'2016-05-13', N'2016-06-04', N'1897', N'6982'); +commit transaction; diff --git a/dtests/src/resources/scripts/cdcConnector/scriptsForApp2/cdc_source_connection.properties b/dtests/src/resources/scripts/cdcConnector/scriptsForApp2/cdc_source_connection.properties index 42ca923570..9e1faddf49 100644 --- a/dtests/src/resources/scripts/cdcConnector/scriptsForApp2/cdc_source_connection.properties +++ b/dtests/src/resources/scripts/cdcConnector/scriptsForApp2/cdc_source_connection.properties @@ -1,5 +1,5 @@ driver=com.microsoft.sqlserver.jdbc.SQLServerDriver -url=jdbc:sqlserver://sqlent2.eastus.cloudapp.azure.com:1434;DatabaseName=testdatabase +url=jdbc:sqlserver://sqlserver2-et16.copfedn1qbcz.us-west-2.rds.amazonaws.com:1435;DatabaseName=testdatabase user=sqldb password=snappydata#msft1 databaseName=testdatabase diff --git a/dtests/src/resources/scripts/cdcConnector/source_destination1.properties b/dtests/src/resources/scripts/cdcConnector/source_destination1.properties new file mode 100644 index 0000000000..9c5ccbbcf0 --- /dev/null +++ b/dtests/src/resources/scripts/cdcConnector/source_destination1.properties @@ -0,0 +1,11 @@ +testdatabase.cdc.dbo_AGREEMENT1_CT=AGREEMENT +testdatabase.cdc.dbo_BANK1_CT=BANK +testdatabase.cdc.dbo_BENEFIT_GROUP_NAME1_CT=BENEFIT_GROUP_NAME +testdatabase.cdc.dbo_BENEFIT_GROUPS1_CT=BENEFIT_GROUPS +testdatabase.cdc.dbo_BENEFIT_PACKAGE1_CT=BENEFIT_PACKAGE +testdatabase.cdc.dbo_TOPIC1_CT=TOPIC +testdatabase.cdc.dbo_TOPIC_COMMUNICATION1_CT=TOPIC_COMMUNICATION +testdatabase.cdc.dbo_GROUPS1_CT=GROUPS +testdatabase.cdc.dbo_PERSON_EVENT1_CT=PERSON_EVENT +testdatabase.cdc.dbo_CODE_VALUE1_CT=CODE_VALUE +testdatabase.cdc.dbo_CLAIM1_CT=CLAIM diff --git a/dtests/src/resources/scripts/cdcConnector/source_destination2.properties b/dtests/src/resources/scripts/cdcConnector/source_destination2.properties new file mode 100644 index 0000000000..49904c116e --- /dev/null +++ b/dtests/src/resources/scripts/cdcConnector/source_destination2.properties @@ -0,0 +1,11 @@ +testdatabase.cdc.dbo_AGREEMENT2_CT=AGREEMENT +testdatabase.cdc.dbo_BANK2_CT=BANK +testdatabase.cdc.dbo_BENEFIT_GROUP_NAME2_CT=BENEFIT_GROUP_NAME +testdatabase.cdc.dbo_BENEFIT_GROUPS2_CT=BENEFIT_GROUPS +testdatabase.cdc.dbo_BENEFIT_PACKAGE2_CT=BENEFIT_PACKAGE +testdatabase.cdc.dbo_TOPIC2_CT=TOPIC +testdatabase.cdc.dbo_TOPIC_COMMUNICATION2_CT=TOPIC_COMMUNICATION +testdatabase.cdc.dbo_GROUPS2_CT=GROUPS +testdatabase.cdc.dbo_PERSON_EVENT2_CT=PERSON_EVENT +testdatabase.cdc.dbo_CODE_VALUE2_CT=CODE_VALUE +testdatabase.cdc.dbo_CLAIM2_CT=CLAIM diff --git a/dtests/src/resources/scripts/cdcConnector/source_destination3.properties b/dtests/src/resources/scripts/cdcConnector/source_destination3.properties new file mode 100644 index 0000000000..b28b955d4c --- /dev/null +++ b/dtests/src/resources/scripts/cdcConnector/source_destination3.properties @@ -0,0 +1,11 @@ +testdatabase.cdc.dbo_AGREEMENT3_CT=AGREEMENT +testdatabase.cdc.dbo_BANK3_CT=BANK +testdatabase.cdc.dbo_BENEFIT_GROUP_NAME3_CT=BENEFIT_GROUP_NAME +testdatabase.cdc.dbo_BENEFIT_GROUPS3_CT=BENEFIT_GROUPS +testdatabase.cdc.dbo_BENEFIT_PACKAGE3_CT=BENEFIT_PACKAGE +testdatabase.cdc.dbo_TOPIC3_CT=TOPIC +testdatabase.cdc.dbo_TOPIC_COMMUNICATION3_CT=TOPIC_COMMUNICATION +testdatabase.cdc.dbo_GROUPS3_CT=GROUPS +testdatabase.cdc.dbo_PERSON_EVENT3_CT=PERSON_EVENT +testdatabase.cdc.dbo_CODE_VALUE3_CT=CODE_VALUE +testdatabase.cdc.dbo_CLAIM3_CT=CLAIM diff --git a/dtests/src/resources/scripts/cdcConnector/source_destination4.properties b/dtests/src/resources/scripts/cdcConnector/source_destination4.properties new file mode 100644 index 0000000000..f9b0a9d650 --- /dev/null +++ b/dtests/src/resources/scripts/cdcConnector/source_destination4.properties @@ -0,0 +1,11 @@ +testdatabase.cdc.dbo_AGREEMENT4_CT=AGREEMENT +testdatabase.cdc.dbo_BANK4_CT=BANK +testdatabase.cdc.dbo_BENEFIT_GROUP_NAME4_CT=BENEFIT_GROUP_NAME +testdatabase.cdc.dbo_BENEFIT_GROUPS4_CT=BENEFIT_GROUPS +testdatabase.cdc.dbo_BENEFIT_PACKAGE4_CT=BENEFIT_PACKAGE +testdatabase.cdc.dbo_TOPIC4_CT=TOPIC +testdatabase.cdc.dbo_TOPIC_COMMUNICATION4_CT=TOPIC_COMMUNICATION +testdatabase.cdc.dbo_GROUPS4_CT=GROUPS +testdatabase.cdc.dbo_PERSON_EVENT4_CT=PERSON_EVENT +testdatabase.cdc.dbo_CODE_VALUE4_CT=CODE_VALUE +testdatabase.cdc.dbo_CLAIM4_CT=CLAIM diff --git a/dtests/src/resources/scripts/cdcConnector/source_destination5.properties b/dtests/src/resources/scripts/cdcConnector/source_destination5.properties new file mode 100644 index 0000000000..f349faf2a3 --- /dev/null +++ b/dtests/src/resources/scripts/cdcConnector/source_destination5.properties @@ -0,0 +1,11 @@ +testdatabase.cdc.dbo_AGREEMENT5_CT=AGREEMENT +testdatabase.cdc.dbo_BANK5_CT=BANK +testdatabase.cdc.dbo_BENEFIT_GROUP_NAME5_CT=BENEFIT_GROUP_NAME +testdatabase.cdc.dbo_BENEFIT_GROUPS5_CT=BENEFIT_GROUPS +testdatabase.cdc.dbo_BENEFIT_PACKAGE5_CT=BENEFIT_PACKAGE +testdatabase.cdc.dbo_TOPIC5_CT=TOPIC +testdatabase.cdc.dbo_TOPIC_COMMUNICATION5_CT=TOPIC_COMMUNICATION +testdatabase.cdc.dbo_GROUPS5_CT=GROUPS +testdatabase.cdc.dbo_PERSON_EVENT5_CT=PERSON_EVENT +testdatabase.cdc.dbo_CODE_VALUE5_CT=CODE_VALUE +testdatabase.cdc.dbo_CLAIM5_CT=CLAIM diff --git a/dtests/src/resources/scripts/cdcConnector/tableListTemp.txt b/dtests/src/resources/scripts/cdcConnector/tableListTemp.txt index 008189cd27..61b89a30c9 100644 --- a/dtests/src/resources/scripts/cdcConnector/tableListTemp.txt +++ b/dtests/src/resources/scripts/cdcConnector/tableListTemp.txt @@ -1,7 +1,11 @@ -ADJUSTMENT=ADJ_ID; AGREEMENT=AGREE_ID; BANK=BNK_ID; -BANK_ACCOUNT=BNK_ACCT_ID; BENEFIT_GROUP_NAME=BENE_GRP_ID; BENEFIT_GROUPS=BENE_GRP_ID; -BENEFIT_PACKAGE=BENE_PKG_ID; \ No newline at end of file +BENEFIT_PACKAGE=BENE_PKG_ID; +CODE_VALUE=CD_VAL_ID; +GROUPS=GRP_ID; +PERSON_EVENT=PRSN_EVNT_ID; +TOPIC=TPC_ID; +TOPIC_COMMUNICATION=TPC_INQ_ID; +CLAIM=CLM_ID; diff --git a/dtests/src/resources/scripts/cdcConnector/truncateTable.sql b/dtests/src/resources/scripts/cdcConnector/truncateTable.sql new file mode 100644 index 0000000000..727ff5d7ef --- /dev/null +++ b/dtests/src/resources/scripts/cdcConnector/truncateTable.sql @@ -0,0 +1,110 @@ +DELETE FROM [testdatabase].[dbo].[AGREEMENT1] WHERE AGREE_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BANK1] WHERE BNK_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUP_NAME1] WHERE BENE_GRP_NM_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUPS1] WHERE BENE_GRP_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_PACKAGE1] WHERE BENE_PKG_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[TOPIC1] WHERE TPC_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[TOPIC_COMMUNICATION1] WHERE TPC_INQ_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[GROUPS1] WHERE GRP_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[PERSON_EVENT1] WHERE PRSN_EVNT_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[CODE_VALUE1] WHERE CD_VAL_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[CLAIM1] WHERE CLM_ID >= 1 ; +TRUNCATE TABLE testdatabase.cdc.dbo_AGREEMENT1_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_GROUP_NAME1_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_GROUPS1_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_PACKAGE1_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_TOPIC1_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_TOPIC_COMMUNICATION1_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_GROUPS1_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_PERSON_EVENT1_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_CODE_VALUE1_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_CLAIM1_CT; +DELETE FROM [testdatabase].[dbo].[CLAIM2] WHERE CLM_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[AGREEMENT2] WHERE AGREE_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BANK2] WHERE BNK_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUP_NAME2] WHERE BENE_GRP_NM_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUPS2] WHERE BENE_GRP_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_PACKAGE2] WHERE BENE_PKG_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[TOPIC2] WHERE TPC_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[TOPIC_COMMUNICATION2] WHERE TPC_INQ_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[GROUPS2] WHERE GRP_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[PERSON_EVENT2] WHERE PRSN_EVNT_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[CODE_VALUE2] WHERE CD_VAL_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[CLAIM2] WHERE CLM_ID >= 1 ; +TRUNCATE TABLE testdatabase.cdc.dbo_AGREEMENT2_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BANK2_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_GROUP_NAME2_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_GROUPS2_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_PACKAGE2_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_TOPIC2_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_TOPIC_COMMUNICATION2_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_GROUPS2_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_PERSON_EVENT2_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_CODE_VALUE2_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_CLAIM2_CT; +DELETE FROM [testdatabase].[dbo].[CLAIM3] WHERE CLM_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[AGREEMENT3] WHERE AGREE_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BANK3] WHERE BNK_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUP_NAME3] WHERE BENE_GRP_NM_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUPS3] WHERE BENE_GRP_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_PACKAGE3] WHERE BENE_PKG_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[TOPIC3] WHERE TPC_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[TOPIC_COMMUNICATION3] WHERE TPC_INQ_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[GROUPS3] WHERE GRP_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[PERSON_EVENT3] WHERE PRSN_EVNT_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[CODE_VALUE3] WHERE CD_VAL_ID >= 1 ; +TRUNCATE TABLE testdatabase.cdc.dbo_AGREEMENT3_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BANK3_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_GROUP_NAME3_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_GROUPS3_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_PACKAGE3_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_TOPIC3_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_TOPIC_COMMUNICATION3_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_GROUPS3_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_PERSON_EVENT3_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_CODE_VALUE3_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_CLAIM3_CT; +DELETE FROM [testdatabase].[dbo].[CLAIM4] WHERE CLM_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[AGREEMENT4] WHERE AGREE_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BANK4] WHERE BNK_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUP_NAME4] WHERE BENE_GRP_NM_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUPS4] WHERE BENE_GRP_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_PACKAGE4] WHERE BENE_PKG_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[TOPIC4] WHERE TPC_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[TOPIC_COMMUNICATION4] WHERE TPC_INQ_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[GROUPS4] WHERE GRP_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[PERSON_EVENT4] WHERE PRSN_EVNT_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[CODE_VALUE4] WHERE CD_VAL_ID >= 1 ; +TRUNCATE TABLE testdatabase.cdc.dbo_AGREEMENT4_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BANK4_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_GROUP_NAME4_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_GROUPS4_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_PACKAGE4_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_TOPIC4_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_TOPIC_COMMUNICATION4_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_GROUPS4_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_PERSON_EVENT4_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_CODE_VALUE4_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_CLAIM4_CT; +DELETE FROM [testdatabase].[dbo].[CLAIM5] WHERE CLM_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[AGREEMENT5] WHERE AGREE_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BANK5] WHERE BNK_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUP_NAME5] WHERE BENE_GRP_NM_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_GROUPS5] WHERE BENE_GRP_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[BENEFIT_PACKAGE5] WHERE BENE_PKG_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[TOPIC5] WHERE TPC_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[TOPIC_COMMUNICATION5] WHERE TPC_INQ_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[GROUPS5] WHERE GRP_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[PERSON_EVENT5] WHERE PRSN_EVNT_ID >= 1 ; +DELETE FROM [testdatabase].[dbo].[CODE_VALUE5] WHERE CD_VAL_ID >= 1 ; +TRUNCATE TABLE testdatabase.cdc.dbo_AGREEMENT5_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BANK5_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_GROUP_NAME5_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_GROUPS5_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_BENEFIT_PACKAGE5_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_TOPIC5_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_TOPIC_COMMUNICATION5_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_GROUPS5_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_PERSON_EVENT5_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_CODE_VALUE5_CT; +TRUNCATE TABLE testdatabase.cdc.dbo_CLAIM5_CT; \ No newline at end of file diff --git a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/CDCIngestionApp.java b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/CDCIngestionApp.java index d109bf8701..fef9e933cd 100644 --- a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/CDCIngestionApp.java +++ b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/CDCIngestionApp.java @@ -76,7 +76,7 @@ public Connection getSqlServerConnection() { if (sqlServer.equals("sqlServer1")) { url = "jdbc:sqlserver://sqlent.westus.cloudapp.azure.com:1433"; } else - url = "jdbc:sqlserver://sqlent2.eastus.cloudapp.azure.com:1434"; + url = "jdbc:sqlserver://sqlserver2-et16.copfedn1qbcz.us-west-2.rds.amazonaws.com:1435"; String username = "sqldb"; String password = "snappydata#msft1"; Properties props = new Properties(); @@ -93,38 +93,69 @@ public Connection getSqlServerConnection() { return conn; } - public void insertData(ArrayList queryArray, Connection conn) { - try { - for (int i = 0; i < queryArray.size(); i++) { - String qStr = queryArray.get(i); - System.out.println("Query = " + qStr); - System.out.println("The startRange = " + startRange + " the endRange = " + endRange); - if (qStr.contains("PUT INTO")) { - for (int j = startRange; j <= endRange; j++) { - String newStr; - if (qStr.contains("?")) - newStr = qStr.replace("?", Integer.toString(j)); - else - newStr = qStr; - System.out.println("The new query String is " + newStr); - conn.createStatement().execute(newStr); - } - } else { - for (int j = startRange; j <= endRange; j++) { - PreparedStatement ps = conn.prepareStatement(qStr); - int KEY_ID = j; - ps.setInt(1, KEY_ID); - ps.execute(); +public void insertData(ArrayList queryArray, Connection conn) { + PreparedStatement ps = null; + try { + final int batchSize = 1000; + int count = 0; + Random rnd = new Random(); + for (int i = 0; i < queryArray.size(); i++) { + String qStr = queryArray.get(i); + System.out.println("Query = " + qStr); + System.out.println("The startRange = " + startRange + " the endRange = " + endRange); + if (qStr.contains("PUT INTO")) { + for (int j = startRange; j <= endRange; j++) { + String newStr; + if (qStr.contains("?")) + newStr = qStr.replace("?", Integer.toString(j)); + else + newStr = qStr; + System.out.println("The new query String is " + newStr); + conn.createStatement().execute(newStr); + updateData(queryArray,conn); + } + } else if (qStr.contains("UPDATE")) { + ps = conn.prepareStatement(qStr); + int updateKey = rnd.nextInt(startRange); + ps.setInt(1, updateKey); + ps.execute(); + System.out.println("Key to be updated is " + updateKey); + } else if (qStr.contains("DELETE")) { + ps = conn.prepareStatement(qStr); + int delKey = rnd.nextInt(startRange); + ps.setInt(1, delKey); + ps.execute(); + System.out.println("Key to be deleted is " + delKey); + } else if(qStr.contains("INSERT INTO")){ + ps = conn.prepareStatement(qStr); + for (int j = startRange; j <= endRange; j++) { + int KEY_ID = j; + ps.setInt(1, KEY_ID); + ps.addBatch(); + if (++count % batchSize == 0) { + ps.executeBatch(); } - System.out.println("Thread " + threadName + " finished ingesting " + (endRange - startRange) + " rows in a table"); } + System.out.println("Thread " + threadName + " finished ingesting " + (endRange - startRange) + " rows in a table"); } - System.out.println("FINISHED: Thread " + threadName + " finished ingestion in all the tables"); - } catch (Exception e) { - System.out.println("Caught exception " + e.getMessage()); + else + conn.createStatement().execute(qStr); + } + System.out.println("FINISHED: Thread " + threadName + " finished ingestion in all the tables"); + } catch (Exception e) { + System.out.println("Caught exception " + e.getMessage()); + } finally { + if (ps != null) try { + ps.close(); + } catch (SQLException ex) { + } + if (conn != null) try { + conn.close(); + } catch (SQLException ex) { } - } + } +} public void updateData(ArrayList queryArray, Connection conn) { try { for (int i = 0; i < queryArray.size(); i++) { @@ -211,4 +242,4 @@ public static void main(String args[]) { System.out.println("Spark ApplicationEnd: "); } } -} \ No newline at end of file +} diff --git a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/CDCPerfSparkJob.java b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/CDCPerfSparkJob.java index 19f2c423c9..a20da76167 100644 --- a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/CDCPerfSparkJob.java +++ b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/CDCPerfSparkJob.java @@ -57,7 +57,7 @@ public static Connection getSqlServerConnection(String sqlServer) { if (sqlServer.equals("sqlServer1")) { url = "jdbc:sqlserver://sqlent.westus.cloudapp.azure.com:1433"; } else - url = "jdbc:sqlserver://sqlent2.eastus.cloudapp.azure.com:1434"; + url = "jdbc:sqlserver://sqlserver2-et16.copfedn1qbcz.us-west-2.rds.amazonaws.com:1435"; String username = "sqldb"; String password = "snappydata#msft1"; Properties props = new Properties(); diff --git a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/SnappyCDCPrms.java b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/SnappyCDCPrms.java index 7fb093df6e..4defc94950 100644 --- a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/SnappyCDCPrms.java +++ b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/SnappyCDCPrms.java @@ -151,6 +151,9 @@ public class SnappyCDCPrms extends SnappyPrms { */ public static Long isKeepOrgConf; + public static Long isResubmitApp; + + public static String getNodeInfoForHA() { String nodeInfo = tasktab().stringAt(nodeInfoForHA, tab().stringAt (nodeInfoForHA, null)); @@ -259,6 +262,11 @@ public static boolean getIsNewNodeFirst() { return tasktab().booleanAt(key, tab().booleanAt(key, false)); } + public static boolean getIsResubmitApp() { + Long key = isResubmitApp; + return tasktab().booleanAt(key, tab().booleanAt(key, false)); + } + public static boolean getIsPointLookUP() { Long key = isPointLookUP; return tasktab().booleanAt(key, tab().booleanAt(key, false)); diff --git a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/SnappyCDCTest.java b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/SnappyCDCTest.java index 7306c58a9c..cec434fc20 100644 --- a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/SnappyCDCTest.java +++ b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/SnappyCDCTest.java @@ -319,12 +319,12 @@ public void storeDataCount() { String cntQry = "SELECT COUNT(*) FROM " + tableName; ResultSet rs3 = con.createStatement().executeQuery(cntQry); while (rs3.next()) { - count = rs3.getInt(1); - Log.getLogWriter().info("SP: The tableName = " + tableName + " count = " + count); + count = rs3.getLong(1); + Log.getLogWriter().info("The tableName = " + tableName + " count = " + count); } if(!tableCntMap.containsKey(tableName)) //To avoid overwriting the existing key(table) { - Log.getLogWriter().info("SP: Inserting in the table as " + tableName + " not in the map" ); + Log.getLogWriter().info("Inserting in the table as " + tableName + " not in the map" ); tableCntMap.put(tableName, count); } rs3.close(); @@ -520,7 +520,6 @@ public static void HydraTask_runIngestionApp() { public void runIngestionApp() { try { - // CDCIngestionApp app = new CDCIngestionApp(); Integer threadCnt = SnappyCDCPrms.getThreadCnt(); Integer sRange = SnappyCDCPrms.getInitStartRange(); Integer eRange = SnappyCDCPrms.getInitEndRange(); @@ -537,6 +536,8 @@ public static void HydraTask_closeStreamingJob() { String curlCmd = null; ProcessBuilder pb = null; String appName = SnappyCDCPrms.getAppName(); + int noOfApps = 5; + Boolean isResubmitApp = SnappyCDCPrms.getIsResubmitApp(); String logFileName = "sparkStreamingStopResult_" + System.currentTimeMillis() + ".log"; File log = null; File logFile = null; @@ -546,13 +547,19 @@ public static void HydraTask_closeStreamingJob() { try { InetAddress myHost = InetAddress.getLocalHost(); String hostName[] = myHost.toString().split("/"); - curlCmd = "curl -d \"name=" + appName + "&terminate=true\" -X POST http://" + hostName[0] + ":8080/app/killByName/"; - Log.getLogWriter().info("The curlCmd is " + curlCmd); - pb = new ProcessBuilder("/bin/bash", "-c", curlCmd); - log = new File("."); - String dest = log.getCanonicalPath() + File.separator + logFileName; - logFile = new File(dest); - snappyTest.executeProcess(pb, logFile); + for (int i = 1; i <= noOfApps; i++) { + curlCmd = "curl -d \"name=" + appName + i + "&terminate=true\" -X POST http://" + hostName[0] + ":8080/app/killByName/"; + Log.getLogWriter().info("The curlCmd is " + curlCmd); + pb = new ProcessBuilder("/bin/bash", "-c", curlCmd); + log = new File("."); + String dest = log.getCanonicalPath() + File.separator + logFileName + "i"; + logFile = new File(dest); + snappyTest.executeProcess(pb, logFile); + } + if (isResubmitApp) { + Log.getLogWriter().info("Resubmitting the app " + appName); + HydraTask_executeSparkJob(); + } } catch (Exception ex) { Log.getLogWriter().info("Exception in HydraTask_closeStreamingJob() " + ex.getMessage()); } @@ -761,7 +768,7 @@ public void removeDiskStoreFiles(String nodeName) { try { String dirName = "vm_2_snappyStore1_"+nodeName; String dirPath = getCurrentDirPath() + File.separator + dirName; - Log.getLogWriter().info("SP:The dir path is " + dirPath); + Log.getLogWriter().info("The dir path is " + dirPath); File dir = new File(dirPath); String[] extensions = new String[]{"crf", "drf", "krf", "idxkrf", "if"}; diff --git a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/cdcBasicValidationTest.conf b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/cdcBasicValidationTest.conf index de5522e61b..73f903671c 100644 --- a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/cdcBasicValidationTest.conf +++ b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/cdcBasicValidationTest.conf @@ -9,6 +9,7 @@ These three operation will keep running for the time untill the totalTaskTimeSec And at the end validation is done ,to check if the changes in the sqlserver has been reflected in the snappy cluster."; INCLUDE $JTESTS/io/snappydata/hydra/northwind/startDualModeCluster.conf; +INCLUDE $JTESTS/io/snappydata/hydra/cdcConnector/threadGroups.inc; io.snappydata.hydra.cdcConnector.SnappyCDCPrms-initStartRange = fcn (${initStartRange}) ncf; @@ -19,29 +20,70 @@ INITTASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = H io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} threadGroups = snappyThreads; + +INITTASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSparkJob + io.snappydata.hydra.cluster.SnappyPrms-sparkJobClassNames = io.snappydata.hydra.cdcConnector.CDCPerfSparkJob + io.snappydata.hydra.cluster.SnappyPrms-sparkSubmitExtraPrms = " --jars ${driverJar} " + io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = " 1 ${deleteQFilePath} false 0 true false false ${initStartRange} ${sqlServerInstance} ${dataBaseName}" + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "BulkDeleteApp" + io.snappydata.hydra.cluster.SnappyPrms-userAppJar = snappydata-store-scala-tests*tests.jar + threadGroups = snappyThreads; + INITTASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSparkJob io.snappydata.hydra.cluster.SnappyPrms-sparkJobClassNames = io.snappydata.app.JavaCdcStreamingApp io.snappydata.hydra.cluster.SnappyPrms-sparkSubmitExtraPrms = " --total-executor-cores=${coresPerStrmApp} --jars ${connectorJar},${driverJar},${testJar} " - io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = "${connectionPropFile1} ${sourceDestFile} " + io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = "${connectionPropFile1} ${sourceDestFile1} " io.snappydata.hydra.cluster.SnappyPrms-userAppJar = "${pocJar}" io.snappydata.hydra.cdcConnector.SnappyCDCPrms-isCDCStream = true - io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "JavaCdcStreamingApp" + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "JavaCdcStreamingApp1" threadGroups = snappyThreads ; INITTASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSparkJob - io.snappydata.hydra.cluster.SnappyPrms-sparkJobClassNames = io.snappydata.hydra.cdcConnector.CDCPerfSparkJob - io.snappydata.hydra.cluster.SnappyPrms-sparkSubmitExtraPrms = " --jars ${driverJar} " - io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = " 1 ${deleteQFilePath} false 0 true false false ${initStartRange} ${sqlServerInstance} ${dataBaseName}" - io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "BulkDeleteApp" - io.snappydata.hydra.cluster.SnappyPrms-userAppJar = snappydata-store-scala-tests*tests.jar - threadGroups = snappyThreads; + io.snappydata.hydra.cluster.SnappyPrms-sparkJobClassNames = io.snappydata.app.JavaCdcStreamingApp + io.snappydata.hydra.cluster.SnappyPrms-sparkSubmitExtraPrms = " --total-executor-cores=${coresPerStrmApp} --jars ${connectorJar},${driverJar},${testJar} " + io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = "${connectionPropFile1} ${sourceDestFile2} " + io.snappydata.hydra.cluster.SnappyPrms-userAppJar = "${pocJar}" + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-isCDCStream = true + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "JavaCdcStreamingApp2" + threadGroups = snappyThreads + ; + +INITTASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSparkJob + io.snappydata.hydra.cluster.SnappyPrms-sparkJobClassNames = io.snappydata.app.JavaCdcStreamingApp + io.snappydata.hydra.cluster.SnappyPrms-sparkSubmitExtraPrms = " --total-executor-cores=${coresPerStrmApp} --jars ${connectorJar},${driverJar},${testJar} " + io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = "${connectionPropFile1} ${sourceDestFile3} " + io.snappydata.hydra.cluster.SnappyPrms-userAppJar = "${pocJar}" + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-isCDCStream = true + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "JavaCdcStreamingApp3" + threadGroups = snappyThreads + ; + +INITTASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSparkJob + io.snappydata.hydra.cluster.SnappyPrms-sparkJobClassNames = io.snappydata.app.JavaCdcStreamingApp + io.snappydata.hydra.cluster.SnappyPrms-sparkSubmitExtraPrms = " --total-executor-cores=${coresPerStrmApp} --jars ${connectorJar},${driverJar},${testJar} " + io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = "${connectionPropFile1} ${sourceDestFile4} " + io.snappydata.hydra.cluster.SnappyPrms-userAppJar = "${pocJar}" + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-isCDCStream = true + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "JavaCdcStreamingApp4" + threadGroups = snappyThreads + ; + +INITTASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSparkJob + io.snappydata.hydra.cluster.SnappyPrms-sparkJobClassNames = io.snappydata.app.JavaCdcStreamingApp + io.snappydata.hydra.cluster.SnappyPrms-sparkSubmitExtraPrms = " --total-executor-cores=${coresPerStrmApp} --jars ${connectorJar},${driverJar},${testJar} " + io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = "${connectionPropFile1} ${sourceDestFile5} " + io.snappydata.hydra.cluster.SnappyPrms-userAppJar = "${pocJar}" + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-isCDCStream = true + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "JavaCdcStreamingApp5" + threadGroups = snappyThreads + ; INITTASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSparkJob io.snappydata.hydra.cluster.SnappyPrms-sparkJobClassNames = io.snappydata.hydra.cdcConnector.CDCValidationApp io.snappydata.hydra.cluster.SnappyPrms-sparkSubmitExtraPrms = " --jars ${driverJar} " - io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = " ${tableListPath} 1 false ${dataBaseName} sqlServer1 CDCValidationAppStrm ${initStartRange} " + io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = " ${tableListPath} 1 ${dataBaseName} sqlServer2 CDCValidationAppStrm ${initEndRange} " io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "CDCValidationAppStrm" io.snappydata.hydra.cluster.SnappyPrms-userAppJar = snappydata-store-scala-tests*tests.jar threadGroups = snappyThreads @@ -61,20 +103,29 @@ TASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = Hy io.snappydata.hydra.cluster.SnappyPrms-userAppJar = snappydata-store-scala-tests*tests.jar io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "CDCIngestionApp2" threadGroups = snappyStoreThreads - startInterval = 300 // after every 5 mins - endInterval = 300 + startInterval = 180 // after every 3 mins + endInterval = 180 maxThreads = 1 ; -CLOSETASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSparkJob +TASK taskClass = io.snappydata.hydra.cdcConnector.SnappyCDCTest taskMethod = HydraTask_runConcurrencyJob + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-threadCnt = ${threadCnt} + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-dataLocation = ${queryFilePath} + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-isPointLookUP = true + threadGroups = snappyTaskThread2 + startInterval = 300 //after every 5 mins + endInterval = 300 + maxThreads = 1; + +/*CLOSETASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSparkJob io.snappydata.hydra.cluster.SnappyPrms-sparkJobClassNames = io.snappydata.app.JavaCdcStreamingApp io.snappydata.hydra.cluster.SnappyPrms-sparkSubmitExtraPrms = " --total-executor-cores=${coresPerStrmApp} --jars ${connectorJar},${driverJar},${testJar} " - io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = "${connectionPropFile1} ${sourceDestFile} " + io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = "${connectionPropFile1} ${sourceDestFile1} " io.snappydata.hydra.cluster.SnappyPrms-userAppJar = "${pocJar}" io.snappydata.hydra.cdcConnector.SnappyCDCPrms-isCDCStream = true io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "JavaCdcStreamingApp" threadGroups = snappyThreads - ; + ;*/ CLOSETASK taskClass = io.snappydata.hydra.cdcConnector.SnappyCDCTest taskMethod = HydraTask_closeStreamingJob io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "JavaCdcStreamingApp" @@ -83,16 +134,16 @@ CLOSETASK taskClass = io.snappydata.hydra.cdcConnector.SnappyCDCTest taskMeth CLOSETASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSparkJob io.snappydata.hydra.cluster.SnappyPrms-sparkJobClassNames = io.snappydata.hydra.cdcConnector.CDCValidationApp io.snappydata.hydra.cluster.SnappyPrms-sparkSubmitExtraPrms = " --jars ${driverJar} " - io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = " ${tableListPath} 2 false ${dataBaseName} sqlServer1 CDCValidationAppStrm ${initStartRange} " + io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = " ${tableListPath} 2 ${dataBaseName} sqlServer2 CDCValidationAppStrm ${initEndRange} " io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "CDCValidationAppStrm" io.snappydata.hydra.cluster.SnappyPrms-userAppJar = snappydata-store-scala-tests*tests.jar threadGroups = snappyThreads ; - INCLUDE $JTESTS/io/snappydata/hydra/northwind/stopDualModeCluster.conf; +// INCLUDE $JTESTS/io/snappydata/hydra/northwind/stopDualModeCluster.conf; -hydra.Prms-maxResultWaitSec = 500; -hydra.Prms-totalTaskTimeSec = 600; +hydra.Prms-maxResultWaitSec = 800; +hydra.Prms-totalTaskTimeSec = 1800; io.snappydata.hydra.cluster.SnappyPrms-shufflePartitions = 6; io.snappydata.hydra.cluster.SnappyPrms-serverMemory = 4g; io.snappydata.hydra.cdcConnector.SnappyCDCPrms-isCDC = true; diff --git a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/cdcConnector.bt b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/cdcConnector.bt index 5675c0daaf..8906b651a9 100644 --- a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/cdcConnector.bt +++ b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/cdcConnector.bt @@ -4,57 +4,66 @@ io/snappydata/hydra/cdcConnector/cdcBasicValidationTest.conf C=locator locatorHosts=1 locatorVMsPerHost=1 locatorThreadsPerVM=1 D=worker workerHosts=1 workerVMsPerHost=1 workerThreadsPerVM=1 testJar="$GEMFIRE/../../../dtests/build-artifacts/scala-2.11/libs/snappydata-store-scala-tests-0.1.0-SNAPSHOT-tests.jar" - dataFilesLocation="/export/shared/QA_DATA/USER2_Data_20G" + dataFilesLocation="/export/shared/QA_DATA/cdcData_20G" queryFilePath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/scriptsForApp1/selectOps.sql" - deleteQFilePath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/bulkDeleteTemp.sql" + deleteQFilePath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/truncateTable.sql" insertQueryPath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector" - dataBaseName = testdatabase20G + dataBaseName = testdatabase snappyFileLoc="$GEMFIRE/../snappy" hostPort = "0" - threadCnt = 2 + threadCnt = 5 coresPerStrmApp = 1 - sqlServerInstance = sqlServer1 - connectorJar="$GEMFIRE/../../../snappy-connectors/jdbc-stream-connector/build-artifacts/scala-2.11/libs/snappydata-jdbc-stream-connector_2.11-0.9.2.1.jar" + sqlServerInstance = sqlServer2 + connectorJar="$GEMFIRE/../../../snappy-connectors/jdbc-stream-connector/build-artifacts/scala-2.11/libs/snappydata-jdbc-stream-connector_2.11-0.9.3.jar" driverJar="/export/shared/QA_DATA/sqlServerJar/mssql-jdbc-6.1.0.jre8.jar" - pocJar="$GEMFIRE/../../../snappy-poc/cdc/target/cdc-test-0.0.1.jar" - connectionPropFile1="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/scriptsForApp1/cdc_source_connection.properties" - sourceDestFile="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/source_destination.properties" + //driverJar="/home/supriya/.m2/repository/com/microsoft/sqlserver/mssql-jdbc/6.1.0.jre8/mssql-jdbc-6.1.0.jre8.jar" + pocJar="$GEMFIRE/../../../snappy-connectors/jdbc-stream-connector/src/test/cdc/target/cdc-test-0.0.1.jar" + connectionPropFile1="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/scriptsForApp2/cdc_source_connection.properties" + sourceDestFile1="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/source_destination1.properties" + sourceDestFile2="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/source_destination2.properties" + sourceDestFile3="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/source_destination3.properties" + sourceDestFile4="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/source_destination4.properties" + sourceDestFile5="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/source_destination5.properties" tableListPath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/tableListTemp.txt" - initStartRange=1000001 - initEndRange=1000050 + initStartRange=65000000 + initEndRange=65000010 + maxResultWaitSec=500 + totalTaskTimeSec=600 numVMsToStop=1 - io/snappydata/hydra/cdcConnector/cdcHATest.conf +io/snappydata/hydra/cdcConnector/cdcHATest.conf A=snappyStore snappyStoreHosts=2 snappyStoreVMsPerHost=1 snappyStoreThreadsPerVM=1 B=lead leadHosts=1 leadVMsPerHost=2 leadThreadsPerVM=2 C=locator locatorHosts=1 locatorVMsPerHost=1 locatorThreadsPerVM=1 D=worker workerHosts=1 workerVMsPerHost=1 workerThreadsPerVM=1 testJar="$GEMFIRE/../../../dtests/build-artifacts/scala-2.11/libs/snappydata-store-scala-tests-0.1.0-SNAPSHOT-tests.jar" - dataFilesLocation="/export/shared/QA_DATA/USER2_Data_20G" + dataFilesLocation="/export/shared/QA_DATA/cdcData_20G" queryFilePath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/pointqueries.sql" deleteQFilePath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/bulkDeleteTemp.sql" insertQueryPath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector" snappyFileLoc="$GEMFIRE/../snappy" hostPort = "0" - dataBaseName = testdatabase20G - threadCnt = 2 + dataBaseName = testdatabase + threadCnt = 5 coresPerStrmApp = 2 - sqlServerInstance = sqlServer1 + sqlServerInstance = sqlServer2 connectorJar="$GEMFIRE/../../../snappy-connectors/jdbc-stream-connector/build-artifacts/scala-2.11/libs/snappydata-jdbc-stream-connector_2.11-0.9.2.1.jar" driverJar="/export/shared/QA_DATA/sqlServerJar/mssql-jdbc-6.1.0.jre8.jar" - pocJar="$GEMFIRE/../../../snappy-poc/cdc/target/cdc-test-0.0.1.jar" + pocJar="$GEMFIRE/../../../snappy-connectors/jdbc-stream-connector/src/test/cdc/target/cdc-test-0.0.1.jar" connectionPropFile1="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/scriptsForApp1/cdc_source_connection.properties" sourceDestFile="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/source_destination.properties" tableListPath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/tableListTemp.txt" initStartRange=1000001 initEndRange=1000050 + maxResultWaitSec=900 + totalTaskTimeSec=2100 numVMsToStop=1 io/snappydata/hydra/cdcConnector/cdcConnectorMultiSqlServerInstanceTest.conf A=snappy snappyHosts=1 snappyVMsPerHost=1 snappyThreadsPerVM=10 testJar="$GEMFIRE/../../../dtests/build-artifacts/scala-2.11/libs/snappydata-store-scala-tests-0.1.0-SNAPSHOT-tests.jar" - dataFilesLocationCol="/export/shared/QA_DATA/USER2_Data/Cluster_Data" - dataFilesLocationRow="/export/shared/QA_DATA/USER2_Data/RowTable_Data" + dataFilesLocationCol="/export/shared/QA_DATA/cdcData/Cluster_Data" + dataFilesLocationRow="/export/shared/QA_DATA/cdcData/RowTable_Data" queryFilePath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/pointLookUpQueries.sql" deleteQFilePath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/bulkDelete.sql" insertQueryPath1="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/scriptsForApp1" @@ -65,7 +74,7 @@ io/snappydata/hydra/cdcConnector/cdcBasicValidationTest.conf dataBaseName = testdatabase connectorJar="$GEMFIRE/../../../snappy-connectors/jdbc-stream-connector/build-artifacts/scala-2.11/libs/snappydata-jdbc-stream-connector_2.11-0.9.2-SNAPSHOT.jar" driverJar="/export/shared/QA_DATA/sqlServerJar/mssql-jdbc-6.1.0.jre8.jar" - pocJar="$GEMFIRE/../../../snappy-poc/cdc/target/cdc-test-0.0.1.jar" + pocJar="$GEMFIRE/../../../snappy-connectors/jdbc-stream-connector/src/test/cdc/target/cdc-test-0.0.1.jar" connectionPropFile1="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/scriptsForApp1/cdc_source_connection.properties" sourceDestFile="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/source_destination_tables.properties" connectionPropFile2="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/scriptsForApp2/cdc_source_connection.properties" @@ -76,8 +85,8 @@ io/snappydata/hydra/cdcConnector/cdcBasicValidationTest.conf io/snappydata/hydra/cdcConnector/cdcConnectorLongRunningHAWithMultiSqlServer.conf A=snappy snappyHosts=1 snappyVMsPerHost=1 snappyThreadsPerVM=10 testJar="$GEMFIRE/../../../dtests/build-artifacts/scala-2.11/libs/snappydata-store-scala-tests-0.1.0-SNAPSHOT-tests.jar" - dataFilesLocationCol="/export/shared/QA_DATA/USER2_Data/Cluster_Data" - dataFilesLocationRow="/export/shared/QA_DATA/USER2_Data/RowTable_Data" + dataFilesLocationCol="/export/shared/QA_DATA/cdcData/Cluster_Data" + dataFilesLocationRow="/export/shared/QA_DATA/cdcData/RowTable_Data" queryFilePath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/pointLookUpQueries.sql" deleteQFilePath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/bulkDelete.sql" updateQueryPath="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/update.sql" @@ -93,7 +102,7 @@ io/snappydata/hydra/cdcConnector/cdcBasicValidationTest.conf dataBaseName = testdatabase connectorJar="$GEMFIRE/../../../snappy-connectors/jdbc-stream-connector/build-artifacts/scala-2.11/libs/snappydata-jdbc-stream-connector_2.11-0.9.2.jar" driverJar="/export/shared/QA_DATA/sqlServerJar/mssql-jdbc-6.1.0.jre8.jar" - pocJar="$GEMFIRE/../../../snappy-poc/cdc/target/cdc-test-0.0.1.jar" + pocJar="$GEMFIRE/../../../snappy-connectors/jdbc-stream-connector/src/test/cdc/target/cdc-test-0.0.1.jar" connectionPropFile1="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/scriptsForApp1/cdc_source_connection.properties" sourceDestFile="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/source_destination_tables.properties" connectionPropFile2="$GEMFIRE/../../../dtests/src/resources/scripts/cdcConnector/scriptsForApp2/cdc_source_connection.properties" diff --git a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/cdcHATest.conf b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/cdcHATest.conf index 9a91271885..28d710d886 100644 --- a/dtests/src/test/java/io/snappydata/hydra/cdcConnector/cdcHATest.conf +++ b/dtests/src/test/java/io/snappydata/hydra/cdcConnector/cdcHATest.conf @@ -10,11 +10,12 @@ And at the end validation is done ,to check if the changes in the sqlserver has INCLUDE $JTESTS/io/snappydata/hydra/cdcConnector/cdcBasicValidationTest.conf; INCLUDE $JTESTS/io/snappydata/hydra/cdcConnector/snappyHA.inc; -TASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSparkJob +TASK taskClass = io.snappydata.hydra.cdcConnector.SnappyCDCTest taskMethod = HydraTask_closeStreamingJob io.snappydata.hydra.cluster.SnappyPrms-sparkJobClassNames = io.snappydata.app.JavaCdcStreamingApp io.snappydata.hydra.cluster.SnappyPrms-sparkSubmitExtraPrms = " --total-executor-cores=${coresPerStrmApp} --jars ${connectorJar},${driverJar},${testJar} " io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = "${connectionPropFile1} ${sourceDestFile} " io.snappydata.hydra.cluster.SnappyPrms-userAppJar = "${pocJar}" + io.snappydata.hydra.cdcConnector.SnappyCDCPrms-isResubmitApp = true io.snappydata.hydra.cdcConnector.SnappyCDCPrms-isCDCStream = true io.snappydata.hydra.cdcConnector.SnappyCDCPrms-appName= "JavaCdcStreamingApp" threadGroups = snappyThreads diff --git a/dtests/src/test/java/io/snappydata/hydra/cluster/SnappyConcurrencyTest.java b/dtests/src/test/java/io/snappydata/hydra/cluster/SnappyConcurrencyTest.java index 2975bdcffd..b0272cde1b 100644 --- a/dtests/src/test/java/io/snappydata/hydra/cluster/SnappyConcurrencyTest.java +++ b/dtests/src/test/java/io/snappydata/hydra/cluster/SnappyConcurrencyTest.java @@ -119,7 +119,7 @@ public static void runAnalyticalQueries() throws SQLException { Log.getLogWriter().info("QueryExecutionTime for query: " + queryNum + ":" + query + " is: " + queryExecutionTime / 1000 + " secs"); } } catch (SQLException se) { - if (isStabilityTest && se.getMessage().contains("java.util.concurrent.TimeoutException: Futures timed out after")) + if (isStabilityTest && (se.getMessage().contains("Exception thrown in awaitResult:") || se.getMessage().contains("java.util.concurrent.TimeoutException: Futures timed out after"))) Log.getLogWriter().info("Got exception while executing Analytical query:" + query, se); else throw new TestException("Got exception while executing Analytical query:" + query, se); @@ -143,7 +143,7 @@ public static void runAnalyticalQueries() throws SQLException { SnappyBB.getBB().getSharedCounters().increment(SnappyBB.numQueriesExecuted); SnappyBB.getBB().getSharedCounters().increment(SnappyBB.numAggregationQueriesExecuted); } catch (SQLException se) { - if (isStabilityTest && se.getMessage().contains("java.util.concurrent.TimeoutException: Futures timed out after")) + if (isStabilityTest && (se.getMessage().contains("Exception thrown in awaitResult:") || se.getMessage().contains("java.util.concurrent.TimeoutException: Futures timed out after"))) Log.getLogWriter().info("Got exception while executing Analytical query:" + query, se); else throw new TestException("Got exception while executing Analytical query:" + query, se); diff --git a/dtests/src/test/java/io/snappydata/hydra/cluster/SnappyTest.java b/dtests/src/test/java/io/snappydata/hydra/cluster/SnappyTest.java index 924c17a019..4c85e47602 100644 --- a/dtests/src/test/java/io/snappydata/hydra/cluster/SnappyTest.java +++ b/dtests/src/test/java/io/snappydata/hydra/cluster/SnappyTest.java @@ -2294,7 +2294,7 @@ public String setCDCSparkAppCmds(String userAppArgs, String commonArgs, String s userAppArgs = finalStart2 + " " + finalEnd2 + " " + userAppArgs; Log.getLogWriter().info("For CDCIngestionApp2 app New Start range and end range : " + finalStart2 + " & " + finalEnd2 + " and args = " + userAppArgs); SnappyBB.getBB().getSharedMap().put("START_RANGE_APP2", finalEnd2 + 1); - SnappyBB.getBB().getSharedMap().put("END_RANGE_APP2", finalEnd2 + 100); + SnappyBB.getBB().getSharedMap().put("END_RANGE_APP2", finalEnd2 + 1000); } else if (appName.equals("CDCIngestionApp1")) { userAppArgs = finalStart + " " + finalEnd + " " + userAppArgs; SnappyBB.getBB().getSharedMap().put("finalStartRange", finalStart); @@ -2390,7 +2390,7 @@ public static void HydraTask_InitializeBB() { SnappyBB.getBB().getSharedMap().put("START_RANGE_APP1", startR); SnappyBB.getBB().getSharedMap().put("END_RANGE_APP1", endR); SnappyBB.getBB().getSharedMap().put("START_RANGE_APP2", startR + 5000000); - SnappyBB.getBB().getSharedMap().put("END_RANGE_APP2", 10 + (startR + 5000000)); + SnappyBB.getBB().getSharedMap().put("END_RANGE_APP2", 1000 + (startR + 5000000)); Log.getLogWriter().info("Finished HydraTask_InitializeBB "); } catch (Exception e) { Log.getLogWriter().info("HydraTask_InitializeBB exception " + e.getMessage()); diff --git a/dtests/src/test/scala/io/snappydata/hydra/cdcConnector/CDCValidationApp.scala b/dtests/src/test/scala/io/snappydata/hydra/cdcConnector/CDCValidationApp.scala index c59e384c11..7854f39f95 100644 --- a/dtests/src/test/scala/io/snappydata/hydra/cdcConnector/CDCValidationApp.scala +++ b/dtests/src/test/scala/io/snappydata/hydra/cdcConnector/CDCValidationApp.scala @@ -21,13 +21,11 @@ import java.io.{File, PrintWriter} import java.sql.{Connection, DriverManager, ResultSet} import java.util.Properties -import breeze.numerics.abs -import io.snappydata.hydra.SnappyTestUtils.{getTempDir, writeToFile} + import org.apache.spark.sql.{SQLContext, SnappyContext} import org.apache.spark.{SparkConf, SparkContext} -import scala.collection.mutable -import scala.io.Source + import scala.util.{Failure, Random, Success, Try} @@ -39,11 +37,10 @@ object CDCValidationApp { Thread.sleep(60000) val tableFile = args(0) val flag = args(1) - val isUpdate = args(2) - val dbName = args(3) - val sqlServerInstance = args(4) - val appName = args(5) -// val startRange = args(6).toInt + val dbName = args(2) + val sqlServerInstance = args(3) + val appName = args(4) + val endRange = args(5).toInt val conf = new SparkConf().setAppName(appName) val sc = SparkContext.getOrCreate(conf) val pw = new PrintWriter(appName + flag + ".out") @@ -64,7 +61,7 @@ object CDCValidationApp { hostPort = "sqlent.westus.cloudapp.azure.com:1433" } else{ - hostPort = "sqlent2.eastus.cloudapp.azure.com:1434" + hostPort = "sqlserver2-et16.copfedn1qbcz.us-west-2.rds.amazonaws.com:1435" } val driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver" Class.forName(driver) @@ -117,14 +114,11 @@ object CDCValidationApp { printMapValues(sqlServerTableCnt1Arr) } - if (isUpdate.equals("true")) { - checkDataConsistency - } - - else { + // else { for (j <- 0 to tableNameArr.length - 1) { //validation in case of inserts and deletes // val startRange = SnappyCDCPrms.getInitStartRange() + val tableName = tableNameArr(j) var snappyTableCnt: Long = 0l var sqlServerTableCnt: Long = 0l @@ -133,13 +127,15 @@ object CDCValidationApp { snappyTableCnt = snappyResultSet(a).getLong(0) } pw.println("SnappyTable:" + tableName + "=" + snappyTableCnt + ";") - val sqlTable = "["+dbName+"].[dbo].["+tableName+"]" - val query1 = s"SELECT COUNT(*) FROM $sqlTable" - val resultSet = connection.createStatement().executeQuery(query1) - while (resultSet.next()) { - sqlServerTableCnt = resultSet.getLong(1) + for(k <- 1 to 5) { + val sqlTable = s"[" + dbName + "].[dbo].[" + tableName + k + "]" + val query1 = s"SELECT COUNT(*) FROM $sqlTable" + val resultSet = connection.createStatement().executeQuery(query1) + while (resultSet.next()) { + sqlServerTableCnt = sqlServerTableCnt + resultSet.getLong(1) + } + pw.println("SqlServerTable:" + tableName + "=" + sqlServerTableCnt + ";") } - pw.println("SqlServerTable:" + tableName + "=" + sqlServerTableCnt + ";") if (flag.equals(2.toString)) { @@ -147,19 +143,25 @@ object CDCValidationApp { pw.println() pw.println("=============================================ResultSet Validation ==================================================") val rndNo = new Random() - val idVal = rndNo.nextInt(10) //+ startRange - val sqlQ = "SELECT * FROM "+ sqlTable +" WHERE "+ idNameArr(j) +" = " + idVal + val idVal = rndNo.nextInt(endRange) + 10 + var num = rndNo.nextInt(5) + if(num == 0) { + num += 1 + } + val sqlTab = "[testdatabase].[dbo].[" + tableName + num + "]" + val sqlQ = "SELECT * FROM "+ sqlTab +" WHERE "+ idNameArr(j) +" = " + idVal System.out.println("The sql query is " + sqlQ) val snappyQ = "SELECT * FROM "+ tableName +" WHERE "+ idNameArr(j) +" = " + idVal System.out.println("The snappy query is "+ snappyQ) - fullResultSetValidation(snc, connection, sqlQ, snappyQ, pw) + checkDataConsistency(endRange) + //fullResultSetValidation(snc, connection, sqlQ, snappyQ, pw) pw.println("=====================================================================================================================") // Match the difference : pw.println("=================================================Count Validation=====================================================") pw.println("For table " + tableName + " Present sqlServer cnt = " + sqlServerTableCnt + " Previous sqlServer cnt " + sqlServerTableCnt1Arr(j)) pw.println("For table " + tableName + " Present snappy cnt = " + snappyTableCnt + " Previous snappy cnt " + snappyTableCnt1Arr(j)) - val sqlServerCntDiff = abs(sqlServerTableCnt - sqlServerTableCnt1Arr(j).toLong) - val snappyCntDiff = abs(snappyTableCnt - snappyTableCnt1Arr(j).toLong) + val sqlServerCntDiff = sqlServerTableCnt - sqlServerTableCnt1Arr(j).toLong + val snappyCntDiff = snappyTableCnt - snappyTableCnt1Arr(j).toLong if (sqlServerCntDiff == snappyCntDiff) { pw.println(s"SUCCESS :$tableName in snappy cluster has equal difference of $snappyCntDiff before and after ingestion ") @@ -173,7 +175,7 @@ object CDCValidationApp { pw.println() } } - } + // } //Perform full result set validation def fullResultSetValidation(snc: SnappyContext, sqlConn: Connection, sqlString: String, snappyString: String, pw: PrintWriter): Any = { @@ -194,12 +196,12 @@ object CDCValidationApp { snappyVal.map(x => snappyColVal = x.get(0)) System.out.println("sqlColVal = " + sqlColVal) System.out.println("sqlColVal = " + sqlColVal + " snappyColVal = " + snappyColVal) - // if (sqlColVal.equals(snappyColVal)) { + if (sqlColVal.equals(snappyColVal)) { pw.println("sqlColVal = " + sqlColVal + " is EQUAL to snappyColVal = " + snappyColVal) - // } - // else { - // pw.println("FAILURE : sqlColVal = " + sqlColVal + " is NOT EQUAL to snappyColVal = " + snappyColVal) - // } + } + else { + pw.println("FAILURE : sqlColVal = " + sqlColVal + " is NOT EQUAL to snappyColVal = " + snappyColVal) + } } } } @@ -214,14 +216,16 @@ object CDCValidationApp { } //validation in case of updates: - def checkDataConsistency(): Unit = { + def checkDataConsistency(endRange : Integer): Unit = { // pw.println("Inside checkDataConsistency function") + // Random rnd = new Random() for (i <- 0 until tableNameArr.length - 1) { val tableName = tableNameArr(i) - val sqlServerQ = s"SELECT * FROM [testdatabase].[dbo].[$tableName]" + val idName = idNameArr(i) + val sqlServerQ = s"SELECT * FROM [testdatabase].[dbo].[$tableName] WHERE $idName > $endRange " pw.println("Query is " + sqlServerQ) val sqlServerResultSet = connection.createStatement().executeQuery(sqlServerQ) - val snappyDF = snc.sql(s"SELECT * FROM $tableName") + val snappyDF = snc.sql(s"SELECT * FROM $tableName WHERE $idName > $endRange") //.collect() var cnt = 0 val colName = idNameArr(i) From c651b6bf56f83c7b329812d16f62ee658a752a0a Mon Sep 17 00:00:00 2001 From: Chandresh Bhatt <33648618+BhattChandresh@users.noreply.github.com> Date: Wed, 19 Feb 2020 15:34:48 +0530 Subject: [PATCH 4/4] Snap 3145 (#1535) - Create the tables in external Hive Metastore from Snappy. - Import the data from external Hive Metastore to Snappy native tables. - Execute the queries on external Hive tables from Snappy. - Executes the joins between Hive tables and Snappy tables from Snappy. - Executes the joins between two Hive tables from Snappy. - Test above scenarios in both Snappy Embedded and Smart connector mode. - Use Apache Hadoop and Hive distribution , MySQL. --- .../externalHiveMetaStore.bt | 23 +- .../externalHiveMetaStore.conf | 49 +-- .../externalHiveMetaStore_NotInUse.conf | 43 +++ ...Store.java => hiveMetaStore_NotInUse.java} | 6 +- .../smartConnectorHiveMetaStore.conf | 23 ++ .../hivemetastore/ExternalHiveMetaStore.scala | 362 +++++++++++++++++ .../hivemetastore/HiveMetaStoreUtils.scala | 240 ++++++++++++ .../SmartConnectorExternalHiveMetaStore.scala | 364 ++++++++++++++++++ 8 files changed, 1065 insertions(+), 45 deletions(-) create mode 100644 dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore_NotInUse.conf rename dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/{hiveMetaStore.java => hiveMetaStore_NotInUse.java} (99%) create mode 100644 dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/smartConnectorHiveMetaStore.conf create mode 100644 dtests/src/test/scala/io/snappydata/hydra/hivemetastore/ExternalHiveMetaStore.scala create mode 100644 dtests/src/test/scala/io/snappydata/hydra/hivemetastore/HiveMetaStoreUtils.scala create mode 100644 dtests/src/test/scala/io/snappydata/hydra/hivemetastore/SmartConnectorExternalHiveMetaStore.scala diff --git a/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore.bt b/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore.bt index 4184994553..68f12d47cf 100644 --- a/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore.bt +++ b/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore.bt @@ -1,6 +1,17 @@ -io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore.conf - A=snappyStore snappyStoreHosts=3 snappyStoreVMsPerHost=1 snappyStoreThreadsPerVM=1 - B=lead leadHosts=2 leadVMsPerHost=1 leadThreadsPerVM=2 - C=locator locatorHosts=1 locatorVMsPerHost=1 locatorThreadsPerVM=1 - D=worker workerHosts=3 workerVMsPerHost=1 workerThreadsPerVM=1 - dataFilesLocation="$GEMFIRE/../../../tests/common/src/main/resources/northwind/" + io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore.conf + A=snappyStore snappyStoreHosts=2 snappyStoreVMsPerHost=1 snappyStoreThreadsPerVM=1 + B=lead leadHosts=1 leadVMsPerHost=1 leadThreadsPerVM=2 + C=locator locatorHosts=1 locatorVMsPerHost=1 locatorThreadsPerVM=1 + D=worker workerHosts=2 workerVMsPerHost=1 workerThreadsPerVM=1 + dataFilesLocation="/export/shared/QA_DATA/NW_1GB/" + externalThriftServerHostName="dev13" + externalThriftServerPort="11000" + + io/snappydata/hydra/externalHiveMetaStore/smartConnectorHiveMetaStore.conf + A=snappyStore snappyStoreHosts=2 snappyStoreVMsPerHost=1 snappyStoreThreadsPerVM=1 + B=lead leadHosts=1 leadVMsPerHost=1 leadThreadsPerVM=2 + C=locator locatorHosts=1 locatorVMsPerHost=1 locatorThreadsPerVM=1 + D=worker workerHosts=2 workerVMsPerHost=1 workerThreadsPerVM=1 + dataFilesLocation="/export/shared/QA_DATA/NW_1GB/" + thriftServerHostNameAndPort="dev13:11000" + diff --git a/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore.conf b/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore.conf index 8d08d77866..4a40ea2b81 100644 --- a/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore.conf +++ b/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore.conf @@ -1,43 +1,20 @@ hydra.Prms-testRequirement = "Test cases for external hive mestore"; hydra.Prms-testDescription = "Create the table in external hive metastore, run the queries on it from Snappy, dropping hive tables from Snappy, - Create Hive schema from Snappy, create Hive table in hive schema from Snappy, load the data to Hive table from Snappy, drop the Hive table and the Hive schema from Snappy, - Create Hive table, insert data to Hive table, alter the Hive table name from Snappy, drop the Hive table from Snappy, - Execute the join queries between the Hive tables and Snappy Tables, - Create External hive table from beeline, access it from snappy, run queries on it from Snappy, drop the table from Snappy."; +Create Hive schema from Snappy, create Hive table in hive schema from Snappy, load the data to Hive table from Snappy, drop the Hive table and the Hive schema from Snappy, +Create Hive table, insert data to Hive table, alter the Hive table name from Snappy, drop the Hive table from Snappy, +Execute the join queries between the Hive tables and Snappy Tables, +Create External hive table from beeline, access it from snappy, run queries on it from Snappy, drop the table from Snappy."; INCLUDE $JTESTS/io/snappydata/hydra/northwind/startDualModeCluster.conf; -INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_InsertData_AlterTableFromSnappy -threadGroups = snappyThreads; - -INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_CreateAndDropSchemaFromSnappy -io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} -threadGroups = snappyThreads; - -INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_DropAllTheTables -threadGroups = snappyThreads; - -INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_CreateTableAndLoadDataFromBeeline -io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} -threadGroups = snappyThreads; - -INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_CreateTableAndLoadDataFromSnappy -io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} -threadGroups = snappyThreads; - -INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_CreateExternalTblFromBeelineAndPerformOpsFromSnappy -io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} -threadGroups = snappyThreads; - -INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_QueryBeelineTblsFromSnappy -io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} -threadGroups = snappyThreads; - -INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_JoinBetweenHiveAndSnappy -io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} -threadGroups = snappyThreads; - -CLOSETASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_DropAllTheTables -threadGroups = snappyThreads; +TASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSnappyJob + io.snappydata.hydra.cluster.SnappyPrms-jobClassNames = io.snappydata.hydra.hivemetastore.ExternalHiveMetaStore + io.snappydata.hydra.cluster.SnappyPrms-userAppName = "EmbeddedExternalHiveMetaStore" + io.snappydata.hydra.cluster.SnappyPrms-appPropsForJobServer ="dataFilesLocation=${dataFilesLocation},externalThriftServerHostName=${externalThriftServerHostName},externalThriftServerPort=${externalThriftServerPort}" + io.snappydata.hydra.cluster.SnappyPrms-userAppJar = snappydata-store-scala-tests*tests.jar + threadGroups = snappyStoreThreads + maxTimesToRun = 1; INCLUDE $JTESTS/io/snappydata/hydra/northwind/stopDualModeCluster.conf; + +io.snappydata.hydra.cluster.SnappyPrms-leaderLauncherProps = " -heap-size=4g"; \ No newline at end of file diff --git a/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore_NotInUse.conf b/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore_NotInUse.conf new file mode 100644 index 0000000000..8d08d77866 --- /dev/null +++ b/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/externalHiveMetaStore_NotInUse.conf @@ -0,0 +1,43 @@ +hydra.Prms-testRequirement = "Test cases for external hive mestore"; +hydra.Prms-testDescription = "Create the table in external hive metastore, run the queries on it from Snappy, dropping hive tables from Snappy, + Create Hive schema from Snappy, create Hive table in hive schema from Snappy, load the data to Hive table from Snappy, drop the Hive table and the Hive schema from Snappy, + Create Hive table, insert data to Hive table, alter the Hive table name from Snappy, drop the Hive table from Snappy, + Execute the join queries between the Hive tables and Snappy Tables, + Create External hive table from beeline, access it from snappy, run queries on it from Snappy, drop the table from Snappy."; + +INCLUDE $JTESTS/io/snappydata/hydra/northwind/startDualModeCluster.conf; + +INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_InsertData_AlterTableFromSnappy +threadGroups = snappyThreads; + +INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_CreateAndDropSchemaFromSnappy +io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} +threadGroups = snappyThreads; + +INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_DropAllTheTables +threadGroups = snappyThreads; + +INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_CreateTableAndLoadDataFromBeeline +io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} +threadGroups = snappyThreads; + +INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_CreateTableAndLoadDataFromSnappy +io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} +threadGroups = snappyThreads; + +INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_CreateExternalTblFromBeelineAndPerformOpsFromSnappy +io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} +threadGroups = snappyThreads; + +INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_QueryBeelineTblsFromSnappy +io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} +threadGroups = snappyThreads; + +INITTASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_JoinBetweenHiveAndSnappy +io.snappydata.hydra.cluster.SnappyPrms-dataLocation = ${dataFilesLocation} +threadGroups = snappyThreads; + +CLOSETASK taskClass = io.snappydata.hydra.externalHiveMetaStore.hiveMetaStore taskMethod = HydraTask_DropAllTheTables +threadGroups = snappyThreads; + +INCLUDE $JTESTS/io/snappydata/hydra/northwind/stopDualModeCluster.conf; diff --git a/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/hiveMetaStore.java b/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/hiveMetaStore_NotInUse.java similarity index 99% rename from dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/hiveMetaStore.java rename to dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/hiveMetaStore_NotInUse.java index da54ce2f93..d05406a5bf 100644 --- a/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/hiveMetaStore.java +++ b/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/hiveMetaStore_NotInUse.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Vector; -public class hiveMetaStore extends SnappyTest +public class hiveMetaStore_NotInUse extends SnappyTest { static String setexternalHiveCatalog = "set spark.sql.catalogImplementation=hive"; static String setexternalInBuiltCatalog = "set spark.sql.catalogImplementation=in-memory"; @@ -46,9 +46,9 @@ public class hiveMetaStore extends SnappyTest //"SELECT o.OrderID, c.CompanyName, e.FirstName, e.LastName FROM snappy_orders o JOIN snappy_employees e ON (e.EmployeeID = o.EmployeeID) JOIN snappy_customers c ON (c.CustomerID = o.CustomerID) WHERE o.ShippedDate > o.RequiredDate AND o.OrderDate > Cast('1998-01-01' as TIMESTAMP) ORDER BY c.CompanyName" }; - static hiveMetaStore metaStore = new hiveMetaStore(); + static hiveMetaStore_NotInUse metaStore = new hiveMetaStore_NotInUse(); - public hiveMetaStore() { + public hiveMetaStore_NotInUse() { } public static Connection connectToBeeline() { diff --git a/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/smartConnectorHiveMetaStore.conf b/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/smartConnectorHiveMetaStore.conf new file mode 100644 index 0000000000..7b1e7cb81b --- /dev/null +++ b/dtests/src/test/java/io/snappydata/hydra/externalHiveMetaStore/smartConnectorHiveMetaStore.conf @@ -0,0 +1,23 @@ +hydra.Prms-testRequirement = "Test cases for external hive mestore"; +hydra.Prms-testDescription = "Create the table in external hive metastore, run the queries on it from Snappy, dropping hive tables from Snappy, +Create Hive schema from Snappy, create Hive table in hive schema from Snappy, load the data to Hive table from Snappy, drop the Hive table and the Hive schema from Snappy, +Create Hive table, insert data to Hive table, alter the Hive table name from Snappy, drop the Hive table from Snappy, +Execute the join queries between the Hive tables and Snappy Tables, +Create External hive table from beeline, access it from snappy, run queries on it from Snappy, drop the table from Snappy."; + +INCLUDE $JTESTS/io/snappydata/hydra/northwind/startDualModeCluster.conf; + +TASK taskClass = io.snappydata.hydra.cluster.SnappyTest taskMethod = HydraTask_executeSparkJob + io.snappydata.hydra.cluster.SnappyPrms-sparkSubmitExtraPrms = " --conf spark.sql.autoBroadcastJoinThreshold=-1" + io.snappydata.hydra.cluster.SnappyPrms-sparkJobClassNames = io.snappydata.hydra.hivemetastore.SmartConnectorExternalHiveMetaStore + io.snappydata.hydra.cluster.SnappyPrms-userAppArgs = "${dataFilesLocation} ${thriftServerHostNameAndPort}" + io.snappydata.hydra.cluster.SnappyPrms-userAppJar = snappydata-store-scala-tests*tests.jar + threadGroups = snappyStoreThreads + maxTimesToRun = 1; + +INCLUDE $JTESTS/io/snappydata/hydra/northwind/stopDualModeCluster.conf; + + // ---> Uncomment below settings if run on single host with limited resources. +//io.snappydata.hydra.cluster.SnappyPrms-leaderLauncherProps = " -heap-size=1g"; +//io.snappydata.hydra.cluster.SnappyPrms-serverLauncherProps = " -heap-size=2g"; +io.snappydata.hydra.cluster.SnappyPrms-executorMemory = 5g; diff --git a/dtests/src/test/scala/io/snappydata/hydra/hivemetastore/ExternalHiveMetaStore.scala b/dtests/src/test/scala/io/snappydata/hydra/hivemetastore/ExternalHiveMetaStore.scala new file mode 100644 index 0000000000..a3e7ea5dd1 --- /dev/null +++ b/dtests/src/test/scala/io/snappydata/hydra/hivemetastore/ExternalHiveMetaStore.scala @@ -0,0 +1,362 @@ +/* + * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. See accompanying + * LICENSE file. + */ +package io.snappydata.hydra.hivemetastore + +import java.io.{File, FileOutputStream, PrintWriter} +import java.sql.{Connection, DriverManager} + +import com.typesafe.config.Config +import org.apache.spark.sql._ + +class ExternalHiveMetaStore extends SnappySQLJob { + override def isValidJob(sc: SnappySession, config: Config): SnappyJobValidation = SnappyJobValid() + + override def runSnappyJob(snappySession: SnappySession, jobConfig: Config): Any = { + // scalastyle:off println + println("External Hive MetaStore Embedded mode Job started...") + val dataLocation = jobConfig.getString("dataFilesLocation") + val externalThriftServerHostName = jobConfig.getString("externalThriftServerHostName") + val externalThriftServerPort = jobConfig.getString("externalThriftServerPort") + val outputFile = "ValidateJoinQuery" + "_" + "column" + + System.currentTimeMillis() + jobConfig.getString("logFileName") + val pw: PrintWriter = new PrintWriter(new FileOutputStream(new File(outputFile), false)) + val spark: SparkSession = SparkSession.builder().getOrCreate() + val snc: SnappyContext = snappySession.sqlContext + + val beelineClientConnection: Connection = getBeelineClientConnection(externalThriftServerHostName, externalThriftServerPort) + snc.sql(HiveMetaStoreUtils.setExternalHiveCatalog) + + dropHiveTables(snc, HiveMetaStoreUtils.dropTable) + dropSnappyTables(snc, HiveMetaStoreUtils.dropTable) + dropHiveTables(snc, HiveMetaStoreUtils.dropTable, "HIVE_DB") + dropSnappyTables(snc, HiveMetaStoreUtils.dropTable, "TIBCO_DB") + // Test Case -1 + snc.sql("drop database if exists HIVE_DB") + snc.sql(HiveMetaStoreUtils.setSnappyInBuiltCatalog) + snc.sql("drop schema if exists TIBCO_DB") + snc.sql(HiveMetaStoreUtils.setExternalHiveCatalog) + //SNAP-3191, after resolving this issue remove the comment. + // alterHiveTable_ChangeTableName(snc, pw) + pw.flush() + // Test Case-2 + createAndDropHiveSchema(snc, beelineClientConnection, dataLocation, pw) + pw.flush() + // Test Case 3 and 4 + beelineClientConnection.createStatement().execute(HiveMetaStoreUtils.createDB + "HIVE_DB") + snc.sql(HiveMetaStoreUtils.setSnappyInBuiltCatalog) + snc.sql(HiveMetaStoreUtils.createDB + "TIBCO_DB") + snc.sql(HiveMetaStoreUtils.setExternalHiveCatalog) + createHiveTblsAndLoadData(beelineClientConnection, dataLocation, "HIVE_DB") + createSnappyTblsAndLoadData(snc, dataLocation, "TIBCO_DB", "HIVE_DB") + createHiveTblsAndLoadData(beelineClientConnection, dataLocation) + createSnappyTblsAndLoadData(snc, dataLocation) + executeQueriesOnHiveTables(snc, beelineClientConnection, dataLocation, pw) + executeJoinQueriesOnHiveAndSnappy(snc, beelineClientConnection, dataLocation, pw) + dropHiveTables(snc, HiveMetaStoreUtils.dropTable, "HIVE_DB") + dropSnappyTables(snc, HiveMetaStoreUtils.dropTable, "TIBCO_DB") + snc.sql("drop database if exists HIVE_DB") + snc.sql(HiveMetaStoreUtils.setSnappyInBuiltCatalog) + snc.sql("drop schema if exists TIBCO_DB") + snc.sql(HiveMetaStoreUtils.setExternalHiveCatalog) + dropHiveTables(snc, HiveMetaStoreUtils.dropTable) + dropSnappyTables(snc, HiveMetaStoreUtils.dropTable) + beelineClientConnection.close() + pw.println("External Hive MetaStore Embedded mode job is successful") + pw.flush() + pw.close() + println("External Hive MetaStore Embedded mode job is successful") + } + + def getBeelineClientConnection(externalThriftServerHostName : String, externalThriftServerPort : String): Connection = { + val beelineClientConnection: Connection = DriverManager.getConnection("jdbc:hive2://" + externalThriftServerHostName + ":" + externalThriftServerPort, + "hive", "Snappy!23") + println("Connection with Beeline established.") + beelineClientConnection + } + + def dropHiveTables(snc: SnappyContext, dropTable: String, + schema: String = "default"): Unit = { + snc.sql(dropTable + schema + ".hive_regions") + snc.sql(dropTable + schema + ".hive_categories") + snc.sql(dropTable + schema + ".hive_shippers") + snc.sql(dropTable + schema + ".hive_employees") + snc.sql(dropTable + schema + ".hive_customers") + snc.sql(dropTable + schema + ".hive_orders") + snc.sql(dropTable + schema + ".hive_order_details") + snc.sql(dropTable + schema + ".hive_products") + snc.sql(dropTable + schema + ".hive_suppliers") + snc.sql(dropTable + schema + ".hive_territories") + snc.sql(dropTable + schema + ".hive_employee_territories") + } + + def dropSnappyTables(snc: SnappyContext, dropTable: String, schema: String = "app"): Unit = { + snc.sql(dropTable + schema + ".snappy_regions") + snc.sql(dropTable + schema + ".snappy_categories") + snc.sql(dropTable + schema + ".snappy_shippers") + snc.sql(dropTable + schema + ".snappy_employees") + snc.sql(dropTable + schema + ".snappy_customers") + snc.sql(dropTable + schema + ".snappy_orders") + snc.sql(dropTable + schema + ".snappy_order_details") + snc.sql(dropTable + schema + ".snappy_products") + snc.sql(dropTable + schema + ".snappy_suppliers") + snc.sql(dropTable + schema + ".snappy_territories") + snc.sql(dropTable + schema + ".snappy_employee_territories") + } + + def createHiveTable(tableDef: String, beelineClientConnection: Connection, schema: String): Unit = { + beelineClientConnection.createStatement().execute("create table " + schema + "." + tableDef + + " row format delimited fields terminated by ',' ") + } + + def loadDataToHiveTbls(path: String, tblName: String, + beelineConn: Connection, schema: String): Unit = { + beelineConn.createStatement().execute("load data local inpath '" + path + + "' overwrite into table " + schema + "." + tblName) + } + + def createHiveTblsAndLoadData(beelineClientConnection: Connection, dataLocation: String, + schema: String = "default"): Unit = { + createHiveTable("hive_regions(RegionID int,RegionDescription string)", + beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "regions.csv", "hive_regions", beelineClientConnection, schema) + createHiveTable("hive_categories" + + "(CategoryID int,CategoryName string,Description string,Picture string)", + beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "categories.csv", "hive_categories", + beelineClientConnection, schema) + createHiveTable("hive_shippers(ShipperID int ,CompanyName string ,Phone string)", + beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "shippers.csv", "hive_shippers", beelineClientConnection, schema) + createHiveTable("hive_employees(EmployeeID int,LastName string,FirstName string,Title string," + + "TitleOfCourtesy string,BirthDate timestamp,HireDate timestamp,Address string," + + "City string,Region string,PostalCode string,Country string," + + "HomePhone string,Extension string,Photo string," + + "Notes string,ReportsTo int,PhotoPath string)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "employees.csv", "hive_employees", beelineClientConnection, schema) + createHiveTable("hive_customers(CustomerID string,CompanyName string,ContactName string," + + "ContactTitle string,Address string,City string,Region string," + + "PostalCode string,Country string,Phone string,Fax string)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "customers.csv", "hive_customers", beelineClientConnection, schema) + createHiveTable("hive_orders(OrderID int,CustomerID string,EmployeeID int," + + "OrderDate timestamp,RequiredDate timestamp,ShippedDate timestamp," + + "ShipVia int,Freight double,ShipName string,ShipAddress string,ShipCity string," + + "ShipRegion string,ShipPostalCode string,ShipCountry string)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "orders.csv", "hive_orders", beelineClientConnection, schema) + createHiveTable("hive_order_details(OrderID int,ProductID int,UnitPrice " + + "double,Quantity smallint,Discount double)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "order_details.csv", "hive_order_details", + beelineClientConnection, schema) + createHiveTable("hive_products(ProductID int,ProductName string,SupplierID int," + + "CategoryID int,QuantityPerUnit string,UnitPrice double,UnitsInStock smallint," + + "UnitsOnOrder smallint,ReorderLevel smallint,Discontinued smallint)", + beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "products.csv", "hive_products", beelineClientConnection, schema) + createHiveTable("hive_suppliers(SupplierID int,CompanyName string,ContactName string," + + "ContactTitle string,Address string,City string,Region string," + + "PostalCode string,Country string,Phone string," + + "Fax string,HomePage string)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "suppliers.csv", "hive_suppliers", beelineClientConnection, schema) + createHiveTable("hive_territories(TerritoryID string,TerritoryDescription string," + + "RegionID string)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "territories.csv", "hive_territories", + beelineClientConnection, schema) + createHiveTable("hive_employee_territories(EmployeeID int," + + "TerritoryID string)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "employee_territories.csv", + "hive_employee_territories", beelineClientConnection, schema) + } + + def createSnappyTblsAndLoadData(snc: SnappyContext, dataLocation: String, + schema: String = "app", hiveSchema: String="default"): Unit = { + snc.sql("create table if not exists " + schema + "." + "snappy_regions using row" + + " as select * from " + hiveSchema + "." + "hive_regions") + snc.sql("create table if not exists " + schema + "." + "snappy_categories using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_categories") + snc.sql("create table if not exists " + schema + "." + "snappy_shippers using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_shippers") + snc.sql("create table if not exists " + schema + "." + "snappy_employees using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_employees") + snc.sql("create table if not exists " + schema + "." + "snappy_customers using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_customers") + snc.sql("create table if not exists " + schema + "." + "snappy_orders using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_orders") + snc.sql("create table if not exists " + schema + "." + "snappy_order_details using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_order_details") + snc.sql("create table if not exists " + schema + "." + "snappy_products using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_products") + snc.sql("create table if not exists " + schema + "." + "snappy_suppliers using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_suppliers") + snc.sql("create table if not exists " + schema + "." + "snappy_territories using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_territories") + snc.sql("create table if not exists " + schema + "." + + "snappy_employee_territories " + + "as select * from " + hiveSchema + "." + "hive_employee_territories") + } + + def executeQueries(snc: SnappyContext, query1: String, query2: String, pw: PrintWriter, + index: Int, id : Int): Unit = { + var isDiff1: Boolean = false + var isDiff2: Boolean = false + pw.println("Query" + index + " : " + query1) + val df1 = snc.sql(query1) + if(id == 0) { + pw.println("Hive Query executed from Snappy count: " + df1.count()) + } + if(id ==1) { + pw.println("Hive Join Snappy Count: " + df1.count()) + } + val df2 = snc.sql(query2) + if(id == 0) { + pw.println("Snappy Query Count (Validation) : " + df2.count()) + } + if(id == 1) { + pw.println("Snappy Join Snappy Count (Validation) : " + df2.count()) + } + val diff1 = df1.except(df2) + if (diff1.count() > 0) { + diff1.write.csv("file:///" + + System.getProperty("user.dir") + "/diff1_" + id + "_" + index + ".csv") + } else { + isDiff1 = true + } + val diff2 = df2.except(df1) + if (diff2.count() > 0) { + diff2.write.csv("file:///" + + System.getProperty("user.dir") + "/diff2_" + id + "_" + index + ".cvs") + } else { + isDiff2 = true + } + if (isDiff1 && isDiff2) { + if (id == 0) { + pw.println("For Query " + index + " Hive query Passed.") + } + if(id == 1) { + pw.println("For Query " + index + " Join between Hive and Snappy is Passed.") + } + } + else { + if (id == 0) { + pw.println("For Query " + index + " Hive Query execution is not successful") + } + if(id == 1) { + pw.println("For Query " + index + " Join between Hive and Snappy is not successful") + } + } + isDiff1 = false + isDiff2 = false + pw.println("* * * * * * * * * * * * * * * * * * * * * * * * *") + } + + def alterHiveTable_ChangeTableName(snc: SnappyContext, pw: PrintWriter): Unit = { + snc.sql(HiveMetaStoreUtils.dropTable + "default.Table1") + snc.sql(HiveMetaStoreUtils.dropTable + "default.Table2") + snc.sql("create table if not exists default.Table1(id int, name String) row format delimited fields terminated by ','") + snc.sql("insert into default.Table1 select id, concat('TIBCO_',id) from range(100000)") + snc.sql("alter table default.Table1 rename to default.Table2") + val countDF = snc.sql("select count(*) as Total from default.Table2") + println("countDF : " + countDF.head()) + val count = countDF.head().toString() + .replace("[", "") + .replace("]", "").toLong + if (count.==(100000)) { + pw.println("Create the table in beeline from snappy," + + " \n insert data into it from snappy," + + " \n rename the table name from snappy," + + " \n count the no. of records from snappy and " + + "dropping the beeline table from snappy" + + "\n is successful") + pw.println("Alter table test passed.") + } + pw.println("* * * * * * * * * * * * * * * * * * * * * * * * *") + snc.dropTable("default.Table1", true) + snc.dropTable("default.Table2", true) + } + + def createAndDropHiveSchema(snc: SnappyContext, beelineClientConnection: Connection, + dataLocation: String, pw: PrintWriter): Unit = { + var isDiff1 = false + var isDiff2 = false + snc.sql(HiveMetaStoreUtils.dropTable + "hiveDB.hive_regions") + snc.sql(HiveMetaStoreUtils.dropTable + "snappyDB.staging_regions") + snc.sql(HiveMetaStoreUtils.dropTable + "snappyDB.snappy_regions") + snc.sql("drop database if exists hiveDB") + snc.sql("drop schema if exists snappyDB") + snc.sql("create database if not exists hiveDB") + snc.sql(HiveMetaStoreUtils.setSnappyInBuiltCatalog) + snc.sql("create schema if not exists snappyDB") + snc.sql(HiveMetaStoreUtils.setExternalHiveCatalog) + createHiveTable("hive_regions(RegionID int,RegionDescription string)", beelineClientConnection, + "hiveDB") + loadDataToHiveTbls(dataLocation + "regions.csv", "hive_regions", beelineClientConnection, "hiveDB") + snc.sql("create external table if not exists snappyDB.staging_regions using csv" + + " options(path '" + "file:///" + dataLocation + "regions.csv" + "',header 'true')") + snc.sql("create table if not exists snappyDB.snappy_regions using column" + + " options(BUCKETS '10') as select * from snappyDB.staging_regions") + val df1 = snc.sql("select * from hiveDB.hive_regions " + + "where RegionDescription <> 'RegionDescription'") + pw.println("Hive Table Count : " + df1.count()) + val df2 = snc.sql("select * from snappyDB.snappy_regions") + pw.println("Snappy Table Count : " + df2.count()) + val diff1 = df1.except(df2) + if (diff1.count() > 0) { + diff1.write.csv("file:///" + + System.getProperty("user.dir") + "/diff1_HiveTable" + ".cvs") + } else { + isDiff1 = true + } + val diff2 = df2.except(df1) + if (diff2.count() > 0) { + diff1.write.csv("file:///" + + System.getProperty("user.dir") + "/diff1_SnappyTable" + ".cvs") + } else { + isDiff2 = true + } + if (isDiff1 && isDiff2) { + pw.println("Hive Table is same as Snappy Table") + } + else { + pw.println("Hive Table is not same as Snappy Table") + } + isDiff1 = false + isDiff2 = false + pw.println("* * * * * * * * * * * * * * * * * * * * * * * * *") + snc.sql(HiveMetaStoreUtils.dropTable + "hiveDB.hive_regions") + snc.sql(HiveMetaStoreUtils.dropTable + "snappyDB.staging_regions") + snc.sql(HiveMetaStoreUtils.dropTable + "snappyDB.snappy_regions") + snc.sql("drop database if exists hiveDB") + snc.sql(HiveMetaStoreUtils.setSnappyInBuiltCatalog) + snc.sql("drop schema if exists snappyDB") + snc.sql(HiveMetaStoreUtils.setExternalHiveCatalog) + } + + def executeQueriesOnHiveTables(snc : SnappyContext, beelineClientConnection : Connection, + dataLocation : String, pw : PrintWriter): Unit = { + for(index <- 0 to HiveMetaStoreUtils.beeLineQueries.length-1) { + executeQueries(snc, HiveMetaStoreUtils.beeLineQueries(index), + HiveMetaStoreUtils.snappyQueries(index), pw, index, 0) + } + } + + def executeJoinQueriesOnHiveAndSnappy(snc : SnappyContext, beelineClientConnection : Connection, + dataLocation : String, pw : PrintWriter) : Unit = { + for (index <- 0 to (HiveMetaStoreUtils.joinHiveSnappy.length - 1)) { + executeQueries(snc, HiveMetaStoreUtils.joinHiveSnappy(index), + HiveMetaStoreUtils.validateJoin(index), pw, index, 1) + pw.flush() + } + } +} diff --git a/dtests/src/test/scala/io/snappydata/hydra/hivemetastore/HiveMetaStoreUtils.scala b/dtests/src/test/scala/io/snappydata/hydra/hivemetastore/HiveMetaStoreUtils.scala new file mode 100644 index 0000000000..d438bd4ee6 --- /dev/null +++ b/dtests/src/test/scala/io/snappydata/hydra/hivemetastore/HiveMetaStoreUtils.scala @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. See accompanying + * LICENSE file. + */ +package io.snappydata.hydra.hivemetastore + +object HiveMetaStoreUtils { + val setExternalHiveCatalog: String = + "set spark.sql.catalogImplementation=hive" + val setSnappyInBuiltCatalog: String = + "set spark.sql.catalogImplementation=in-memory" + val showTblsApp: String = + "show tables in app" + val showTblsDefault: String = + "show tables in default" + val dropTable: String = + "drop table if exists " + val createDB: String = + "create database " + + val beeLineQueries = new Array[String](11) + val snappyQueries = new Array[String] (11) + beeLineQueries(0) = "SELECT CategoryID,CategoryName,Description FROM hive_db.hive_categories" + + " where CategoryID is not null" + beeLineQueries(1) = "SELECT FirstName, LastName FROM hive_db.hive_employees " + + "where FirstName <> 'FIRSTNAME' ORDER BY LastName " + beeLineQueries(2) = "SELECT FirstName, LastName FROM hive_db.hive_employees" + + " WHERE Title = 'Sales Representative'" + beeLineQueries(3) = "SELECT SUM(Quantity) AS TotalUnits FROM hive_db.hive_order_details" + + " WHERE ProductID=3" + beeLineQueries(4) = "SELECT OrderID, Freight, Freight * 1.1 AS FreightTotal " + + "FROM hive_db.hive_orders WHERE Freight >= 500" + beeLineQueries(5) = "SELECT City, COUNT(EmployeeID) AS NumEmployees " + + "FROM hive_db.hive_employees " + + "WHERE Title = 'Sales Representative' " + + "GROUP BY City HAVING COUNT(EmployeeID) > 1 ORDER BY NumEmployees" + beeLineQueries(6) = "SELECT ProductID, AVG(UnitPrice) AS AveragePrice " + + "FROM hive_db.hive_products GROUP BY ProductID " + + "HAVING AVG(UnitPrice) > 70 ORDER BY AveragePrice" + beeLineQueries(7) = "SELECT CompanyName FROM hive_db.hive_customers WHERE CustomerID = " + + "(SELECT CustomerID FROM hive_db.hive_orders WHERE OrderID = 687792)" + beeLineQueries(8) = "SELECT ProductName, SupplierID FROM hive_db.hive_products " + + "WHERE SupplierID IN " + + "(SELECT SupplierID FROM hive_db.hive_suppliers " + + "WHERE CompanyName IN ('Exotic Liquids', 'Grandma Kellys Homestead', 'Tokyo Traders')) " + + "order by SupplierID,ProductName" + beeLineQueries(9) = "SELECT CompanyName FROM hive_db.hive_suppliers " + + "WHERE SupplierID IN " + + "(SELECT SupplierID FROM hive_db.hive_products " + + "WHERE CategoryID = " + + "(SELECT CategoryID FROM hive_db.hive_categories " + + "WHERE CategoryName = 'Seafood')) order by CompanyName" + beeLineQueries(10) = "SELECT ProductID,Productname,unitprice,unitsinstock " + + "from hive_db.hive_products where productname like 'M%' order by productname" + + snappyQueries(0) = "SELECT CategoryID,CategoryName,Description FROM hive_db.hive_categories " + + "where CategoryID is not null" + snappyQueries(1) = "SELECT FirstName, LastName FROM tibco_db.snappy_employees ORDER BY LastName" + snappyQueries(2) = "SELECT FirstName, LastName FROM tibco_db.snappy_employees" + + " WHERE Title = 'Sales Representative'" + snappyQueries(3) = "SELECT SUM(Quantity) AS TotalUnits FROM tibco_db.snappy_order_details" + + " WHERE ProductID=3" + snappyQueries(4) = "SELECT OrderID, Freight, Freight * 1.1 AS FreightTotal " + + "FROM tibco_db.snappy_orders WHERE Freight >= 500" + snappyQueries(5) = "SELECT City, COUNT(EmployeeID) AS NumEmployees " + + "FROM tibco_db.snappy_employees " + + "WHERE Title = 'Sales Representative' " + + "GROUP BY City HAVING COUNT(EmployeeID) > 1 ORDER BY NumEmployees;" + snappyQueries(6) = "SELECT ProductID, AVG(UnitPrice) AS AveragePrice " + + "FROM tibco_db.snappy_products GROUP BY ProductID " + + "HAVING AVG(UnitPrice) > 70 ORDER BY AveragePrice" + snappyQueries(7) = "SELECT CompanyName FROM tibco_db.snappy_customers WHERE CustomerID = " + + "(SELECT CustomerID FROM tibco_db.snappy_orders WHERE OrderID = 687792)" + snappyQueries(8) = "SELECT ProductName, SupplierID FROM tibco_db.snappy_products " + + "WHERE SupplierID IN " + + "(SELECT SupplierID FROM tibco_db.snappy_suppliers " + + "WHERE CompanyName IN ('Exotic Liquids', 'Grandma Kellys Homestead', 'Tokyo Traders')) " + + "order by SupplierID,ProductName" + snappyQueries(9) = "SELECT CompanyName FROM tibco_db.snappy_suppliers " + + "WHERE SupplierID IN " + + "(SELECT SupplierID FROM tibco_db.snappy_products " + + "WHERE CategoryID = " + + "(SELECT CategoryID FROM tibco_db.snappy_categories " + + "WHERE CategoryName = 'Seafood')) order by CompanyName" + snappyQueries(10) = "SELECT ProductID,Productname,unitprice,unitsinstock " + + "from hive_db.hive_products where productname like 'M%' order by productname" + + val joinHiveSnappy = new Array[String](12) + val validateJoin = new Array[String](12) + joinHiveSnappy(0) = "SELECT emp.EmployeeID, emp.FirstName, emp.LastName, o.OrderID," + + " o.OrderDate FROM default.hive_employees emp JOIN app.snappy_orders o ON " + + "(emp.EmployeeID = o.EmployeeID) ORDER BY o.OrderID" + joinHiveSnappy(1) = "SELECT o.OrderID, c.CompanyName, e.FirstName, e.LastName " + + "FROM default.hive_orders o JOIN default.hive_employees e ON (e.EmployeeID = o.EmployeeID) " + + "JOIN snappy_customers c ON (c.CustomerID = o.CustomerID) " + + "WHERE o.ShippedDate > o.RequiredDate AND o.OrderDate > Cast('1998-01-01' as TIMESTAMP) " + + "ORDER BY o.OrderID" + joinHiveSnappy(2) = "SELECT p.ProductName, SUM(od.Quantity) AS TotalUnits" + + " FROM default.hive_order_details od JOIN snappy_products p ON" + + " (p.ProductID = od.ProductID)" + + " GROUP BY p.ProductName" + + " HAVING SUM(Quantity) >10 and SUM(Quantity) <100" + joinHiveSnappy(3) = "SELECT emp.EmployeeID,emp.FirstName,emp.LastName," + + "o.OrderID,o.OrderDate FROM" + + " snappy_employees emp JOIN default.hive_orders o ON " + + "(emp.EmployeeID = o.EmployeeID) " + + "where o.EmployeeID < 5 ORDER BY o.OrderID" + joinHiveSnappy(4) = "SELECT o.OrderID,c.CompanyName,e.FirstName, e.LastName" + + " FROM default.hive_orders o JOIN default.hive_employees e " + + "ON (e.EmployeeID = o.EmployeeID) JOIN snappy_customers c " + + "ON (c.CustomerID = o.CustomerID) " + + "WHERE o.ShippedDate > o.RequiredDate AND o.OrderDate > Cast('1998-01-01' as TIMESTAMP) " + + "ORDER BY c.CompanyName" + joinHiveSnappy(5) = "SELECT e.FirstName, e.LastName, o.OrderID FROM " + + "snappy_employees e JOIN default.hive_orders o ON " + + "(e.EmployeeID = o.EmployeeID) " + + "WHERE o.RequiredDate < o.ShippedDate " + + "ORDER BY e.LastName, e.FirstName" + joinHiveSnappy(6) = "select distinct (a.ShippedDate) as ShippedDate,a.OrderID," + + "b.Subtotal,year(a.ShippedDate) as Year " + + "from snappy_orders a inner join" + + "(select distinct OrderID,sum(UnitPrice * Quantity * (1 - Discount)) as Subtotal " + + "from default.hive_order_details group by OrderID) b " + + "on a.OrderID = b.OrderID " + + "where a.ShippedDate is not null and " + + "a.ShippedDate > Cast('1996-12-24' as TIMESTAMP) and " + + "a.ShippedDate < Cast('1997-09-30' as TIMESTAMP) " + + "order by ShippedDate" + joinHiveSnappy(7) = "select distinct a.CategoryID,a.CategoryName,b.ProductName," + + "sum(c.ExtendedPrice) as ProductSales from app.snappy_categories a " + + "inner join default.hive_products b on a.CategoryID = b.CategoryID " + + "inner join " + + "(select distinct y.OrderID,y.ProductID,x.ProductName,y.UnitPrice,y.Quantity,y.Discount," + + "round(y.UnitPrice * y.Quantity * (1 - y.Discount), 2) as ExtendedPrice from " + + "default.hive_products x " + + "inner join app.snappy_order_details y on x.ProductID = y.ProductID " + + "order by y.OrderID) c on c.ProductID = b.ProductID " + + "inner join default.hive_orders d on d.OrderID =c.OrderID " + + "where d.OrderDate > Cast('1997-01-01' as TIMESTAMP) and " + + "d.OrderDate < Cast('1997-12-31' as TIMESTAMP) " + + "group by a.CategoryID, a.CategoryName, b.ProductName " + + "order by a.CategoryName, b.ProductName, ProductSales" + joinHiveSnappy(8) = "select s.supplierid,s.companyname,p.productid,p.productname from " + + "app.snappy_suppliers s join app.snappy_products p on(s.supplierid= p.supplierid) " + + "and s.companyname IN('Grandma Kellys Homestead','Tokyo Traders','Exotic Liquids') " + + "order by companyname,productname" + joinHiveSnappy(9) = "SELECT ShipCountry,Sum(hive_order_details.UnitPrice * Quantity * Discount)" + + " AS ProductSales FROM app.snappy_orders INNER JOIN default.hive_order_details " + + "ON snappy_orders.OrderID = hive_order_details.OrderID " + + "where snappy_orders.OrderID > 11000 GROUP BY ShipCountry order by ProductSales" + joinHiveSnappy(10) = "SELECT emp.EmployeeID, emp.FirstName, emp.LastName, o.OrderID," + + " o.OrderDate FROM default.hive_employees emp JOIN default.hive_orders o ON " + + "(emp.EmployeeID = o.EmployeeID) ORDER BY o.OrderID" + joinHiveSnappy(11) = "SELECT o.OrderID, c.CompanyName, e.FirstName, e.LastName " + + "FROM default.hive_orders o JOIN default.hive_employees e ON (e.EmployeeID = o.EmployeeID) " + + "JOIN default.hive_customers c ON (c.CustomerID = o.CustomerID) " + + "WHERE o.ShippedDate > o.RequiredDate AND o.OrderDate > Cast('1998-01-01' as TIMESTAMP) " + + "ORDER BY o.OrderID" + + validateJoin(0) = "SELECT emp.EmployeeID, emp.FirstName, emp.LastName, o.OrderID," + + " o.OrderDate FROM snappy_employees emp JOIN snappy_orders o ON " + + "(emp.EmployeeID = o.EmployeeID) ORDER BY o.OrderID" + validateJoin(1) = "SELECT o.OrderID, c.CompanyName, e.FirstName, e.LastName " + + "FROM snappy_orders o JOIN snappy_employees e ON (e.EmployeeID = o.EmployeeID) " + + "JOIN snappy_customers c ON (c.CustomerID = o.CustomerID) " + + "WHERE o.ShippedDate > o.RequiredDate AND o.OrderDate > Cast('1998-01-01' as TIMESTAMP) " + + "ORDER BY o.OrderID" + validateJoin(2) = "SELECT p.ProductName, SUM(od.Quantity) AS TotalUnits" + + " FROM snappy_order_details od JOIN snappy_products p ON" + + " (p.ProductID = od.ProductID)" + + " GROUP BY p.ProductName" + + " HAVING SUM(Quantity) >10 and SUM(Quantity) <100" + validateJoin(3) = "SELECT emp.EmployeeID,emp.FirstName,emp.LastName," + + "o.OrderID,o.OrderDate" + + " FROM snappy_employees emp JOIN snappy_orders o ON " + + "(emp.EmployeeID = o.EmployeeID) " + + "where o.EmployeeID < 5 ORDER BY o.OrderID" + validateJoin(4) = "SELECT o.OrderID,c.CompanyName,e.FirstName, e.LastName" + + " FROM snappy_orders o JOIN snappy_employees e " + + "ON (e.EmployeeID = o.EmployeeID) JOIN snappy_customers c " + + "ON (c.CustomerID = o.CustomerID) " + + "WHERE o.ShippedDate > o.RequiredDate AND o.OrderDate > Cast('1998-01-01' as TIMESTAMP) " + + "ORDER BY c.CompanyName" + validateJoin(5) = "SELECT e.FirstName, e.LastName, o.OrderID FROM " + + "snappy_employees e JOIN snappy_orders o ON " + + "(e.EmployeeID = o.EmployeeID) " + + "WHERE o.RequiredDate < o.ShippedDate " + + "ORDER BY e.LastName, e.FirstName" + validateJoin(6) = "select distinct (a.ShippedDate) as ShippedDate,a.OrderID," + + "b.Subtotal,year(a.ShippedDate) as Year " + + "from snappy_orders a inner join" + + "(select distinct OrderID,sum(UnitPrice * Quantity * (1 - Discount)) as Subtotal " + + "from snappy_order_details group by OrderID) b " + + "on a.OrderID = b.OrderID " + + "where a.ShippedDate is not null and " + + "a.ShippedDate > Cast('1996-12-24' as TIMESTAMP) and " + + "a.ShippedDate < Cast('1997-09-30' as TIMESTAMP) " + + "order by ShippedDate" + validateJoin(7) = "select distinct a.CategoryID,a.CategoryName,b.ProductName," + + "sum(c.ExtendedPrice) as ProductSales from app.snappy_categories a " + + "inner join app.snappy_products b on a.CategoryID = b.CategoryID " + + "inner join " + + "(select distinct y.OrderID,y.ProductID,x.ProductName,y.UnitPrice,y.Quantity,y.Discount," + + "round(y.UnitPrice * y.Quantity * (1 - y.Discount), 2) as ExtendedPrice " + + "from app.snappy_products x inner join app.snappy_order_details y " + + "on x.ProductID = y.ProductID order by y.OrderID) c on c.ProductID = b.ProductID " + + "inner join app.snappy_orders d on d.OrderID =c.OrderID " + + "where d.OrderDate > Cast('1997-01-01' as TIMESTAMP) and " + + "d.OrderDate < Cast('1997-12-31' as TIMESTAMP) " + + "group by a.CategoryID, a.CategoryName, b.ProductName " + + "order by a.CategoryName, b.ProductName, ProductSales" + validateJoin(8) = "select s.supplierid,s.companyname,p.productid,p.productname from " + + "app.snappy_suppliers s join app.snappy_products p on(s.supplierid= p.supplierid) " + + "and s.companyname IN('Grandma Kellys Homestead','Tokyo Traders','Exotic Liquids') " + + "order by companyname,productname" + validateJoin(9) = "SELECT ShipCountry,Sum(snappy_order_details.UnitPrice * Quantity * Discount)" + + " AS ProductSales FROM app.snappy_orders INNER JOIN app.snappy_order_details " + + "ON snappy_orders.OrderID = snappy_order_details.OrderID " + + "where snappy_orders.OrderID > 11000 GROUP BY ShipCountry order by ProductSales" + validateJoin(10) = "SELECT emp.EmployeeID, emp.FirstName, emp.LastName, o.OrderID," + + " o.OrderDate FROM snappy_employees emp JOIN snappy_orders o ON " + + "(emp.EmployeeID = o.EmployeeID) ORDER BY o.OrderID" + validateJoin(11) = "SELECT o.OrderID, c.CompanyName, e.FirstName, e.LastName " + + "FROM snappy_orders o JOIN snappy_employees e ON (e.EmployeeID = o.EmployeeID) " + + "JOIN snappy_customers c ON (c.CustomerID = o.CustomerID) " + + "WHERE o.ShippedDate > o.RequiredDate AND o.OrderDate > Cast('1998-01-01' as TIMESTAMP) " + + "ORDER BY o.OrderID" +} diff --git a/dtests/src/test/scala/io/snappydata/hydra/hivemetastore/SmartConnectorExternalHiveMetaStore.scala b/dtests/src/test/scala/io/snappydata/hydra/hivemetastore/SmartConnectorExternalHiveMetaStore.scala new file mode 100644 index 0000000000..303efb43b5 --- /dev/null +++ b/dtests/src/test/scala/io/snappydata/hydra/hivemetastore/SmartConnectorExternalHiveMetaStore.scala @@ -0,0 +1,364 @@ +/* + * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. See accompanying + * LICENSE file. + */ +package io.snappydata.hydra.hivemetastore + +import java.io.{File, FileOutputStream, PrintWriter} +import java.sql.{Connection, DriverManager} + +import org.apache.spark.{SparkConf, SparkContext} +import org.apache.spark.sql.{SnappyContext, SparkSession} + +object SmartConnectorExternalHiveMetaStore { + def main(args: Array[String]): Unit = { + // scalastyle:off println + println("Smart Connector External Hive MetaStore Job started...") + val dataLocation = args(0) + val externalThriftServerHostAndPort = args(1) + val outputFile = "ValidateJoinQuery" + "_" + "column" + + System.currentTimeMillis() + "_sparkApp" + val pw: PrintWriter = new PrintWriter(new FileOutputStream(new File(outputFile), false)) + val connectionURL = args(args.length - 1) + println("Connection URL is : " + connectionURL) + val conf = new SparkConf() + .setAppName("Spark_ExternalHiveMetaStore") + .set("snappydata.connection", connectionURL) + val sc : SparkContext = SparkContext.getOrCreate(conf) + val snc : SnappyContext = SnappyContext(sc) + val spark: SparkSession = SparkSession.builder().getOrCreate() + + val beelineClientConnection: Connection = getBeelineClientConnection(externalThriftServerHostAndPort) + snc.sql(HiveMetaStoreUtils.setExternalHiveCatalog) + dropHiveTables(snc, HiveMetaStoreUtils.dropTable) + dropSnappyTables(snc, HiveMetaStoreUtils.dropTable) + dropHiveTables(snc, HiveMetaStoreUtils.dropTable, "HIVE_DB") + dropSnappyTables(snc, HiveMetaStoreUtils.dropTable, "TIBCO_DB") + // Test Case-1 + snc.sql("drop database if exists HIVE_DB") + snc.sql(HiveMetaStoreUtils.setSnappyInBuiltCatalog) + snc.sql("drop schema if exists TIBCO_DB") + snc.sql(HiveMetaStoreUtils.setExternalHiveCatalog) + // SNAP-3191, after resolving this issue remove the comment. + // alterHiveTable_ChangeTableName(snc, pw) + pw.flush() + // Test Case-2 + createAndDropHiveSchema(snc, beelineClientConnection, dataLocation, pw) + pw.flush() + // Test Case-3 + beelineClientConnection.createStatement().execute(HiveMetaStoreUtils.createDB + "HIVE_DB") + snc.sql(HiveMetaStoreUtils.setSnappyInBuiltCatalog) + snc.sql(HiveMetaStoreUtils.createDB + "TIBCO_DB") + snc.sql(HiveMetaStoreUtils.setExternalHiveCatalog) + createHiveTblsAndLoadData(beelineClientConnection, dataLocation, "HIVE_DB") + createSnappyTblsAndLoadData(snc, dataLocation, "TIBCO_DB", "HIVE_DB") + createHiveTblsAndLoadData(beelineClientConnection, dataLocation) + createSnappyTblsAndLoadData(snc, dataLocation) + executeQueriesOnHiveTables(snc, beelineClientConnection, dataLocation, pw) + executeJoinQueriesOnHiveAndSnappy(snc, beelineClientConnection, dataLocation, pw) + dropHiveTables(snc, HiveMetaStoreUtils.dropTable, "HIVE_DB") + dropSnappyTables(snc, HiveMetaStoreUtils.dropTable, "TIBCO_DB") + snc.sql("drop database if exists HIVE_DB") + snc.sql(HiveMetaStoreUtils.setSnappyInBuiltCatalog) + snc.sql("drop schema if exists TIBCO_DB") + snc.sql(HiveMetaStoreUtils.setExternalHiveCatalog) + dropHiveTables(snc, HiveMetaStoreUtils.dropTable) + dropSnappyTables(snc, HiveMetaStoreUtils.dropTable) + beelineClientConnection.close() + pw.println("Smart Connector External Hive MetaStore job is successful finished.") + pw.flush() + pw.close() + println("Smart Connector External Hive MetaStore job is successful finished.") + } + + def getBeelineClientConnection(externalThriftServerHostAndPort : String): Connection = { + val beelineClientConnection: Connection = DriverManager.getConnection("jdbc:hive2://" + externalThriftServerHostAndPort, + "hive", "Snappy!23") + println("Connection with Beeline established.") + beelineClientConnection + } + + def dropHiveTables(snc: SnappyContext, dropTable: String, + schema: String = "default"): Unit = { + snc.sql(dropTable + schema + ".hive_regions") + snc.sql(dropTable + schema + ".hive_categories") + snc.sql(dropTable + schema + ".hive_shippers") + snc.sql(dropTable + schema + ".hive_employees") + snc.sql(dropTable + schema + ".hive_customers") + snc.sql(dropTable + schema + ".hive_orders") + snc.sql(dropTable + schema + ".hive_order_details") + snc.sql(dropTable + schema + ".hive_products") + snc.sql(dropTable + schema + ".hive_suppliers") + snc.sql(dropTable + schema + ".hive_territories") + snc.sql(dropTable + schema + ".hive_employee_territories") + } + + def dropSnappyTables(snc: SnappyContext, dropTable: String, schema: String = "app"): Unit = { + snc.sql(dropTable + schema + ".snappy_regions") + snc.sql(dropTable + schema + ".snappy_categories") + snc.sql(dropTable + schema + ".snappy_shippers") + snc.sql(dropTable + schema + ".snappy_employees") + snc.sql(dropTable + schema + ".snappy_customers") + snc.sql(dropTable + schema + ".snappy_orders") + snc.sql(dropTable + schema + ".snappy_order_details") + snc.sql(dropTable + schema + ".snappy_products") + snc.sql(dropTable + schema + ".snappy_suppliers") + snc.sql(dropTable + schema + ".snappy_territories") + snc.sql(dropTable + schema + ".snappy_employee_territories") + } + + def createHiveTable(tableDef: String, beelineClientConnection: Connection, schema: String): Unit = { + beelineClientConnection.createStatement().execute("create table " + schema + "." + tableDef + + " row format delimited fields terminated by ',' ") + } + + def loadDataToHiveTbls(path: String, tblName: String, + beelineConn: Connection, schema: String): Unit = { + beelineConn.createStatement().execute("load data local inpath '" + path + + "' overwrite into table " + schema + "." + tblName) + } + + def createHiveTblsAndLoadData(beelineClientConnection: Connection, dataLocation: String, + schema: String = "default"): Unit = { + createHiveTable("hive_regions(RegionID int,RegionDescription string)", + beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "regions.csv", "hive_regions", beelineClientConnection, schema) + createHiveTable("hive_categories" + + "(CategoryID int,CategoryName string,Description string,Picture string)", + beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "categories.csv", "hive_categories", + beelineClientConnection, schema) + createHiveTable("hive_shippers(ShipperID int ,CompanyName string ,Phone string)", + beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "shippers.csv", "hive_shippers", beelineClientConnection, schema) + createHiveTable("hive_employees(EmployeeID int,LastName string,FirstName string,Title string," + + "TitleOfCourtesy string,BirthDate timestamp,HireDate timestamp,Address string," + + "City string,Region string,PostalCode string,Country string," + + "HomePhone string,Extension string,Photo string," + + "Notes string,ReportsTo int,PhotoPath string)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "employees.csv", "hive_employees", beelineClientConnection, schema) + createHiveTable("hive_customers(CustomerID string,CompanyName string,ContactName string," + + "ContactTitle string,Address string,City string,Region string," + + "PostalCode string,Country string,Phone string,Fax string)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "customers.csv", "hive_customers", beelineClientConnection, schema) + createHiveTable("hive_orders(OrderID int,CustomerID string,EmployeeID int," + + "OrderDate timestamp,RequiredDate timestamp,ShippedDate timestamp," + + "ShipVia int,Freight double,ShipName string,ShipAddress string,ShipCity string," + + "ShipRegion string,ShipPostalCode string,ShipCountry string)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "orders.csv", "hive_orders", beelineClientConnection, schema) + createHiveTable("hive_order_details(OrderID int,ProductID int,UnitPrice " + + "double,Quantity smallint,Discount double)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "order_details.csv", "hive_order_details", + beelineClientConnection, schema) + createHiveTable("hive_products(ProductID int,ProductName string,SupplierID int," + + "CategoryID int,QuantityPerUnit string,UnitPrice double,UnitsInStock smallint," + + "UnitsOnOrder smallint,ReorderLevel smallint,Discontinued smallint)", + beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "products.csv", "hive_products", beelineClientConnection, schema) + createHiveTable("hive_suppliers(SupplierID int,CompanyName string,ContactName string," + + "ContactTitle string,Address string,City string,Region string," + + "PostalCode string,Country string,Phone string," + + "Fax string,HomePage string)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "suppliers.csv", "hive_suppliers", beelineClientConnection, schema) + createHiveTable("hive_territories(TerritoryID string,TerritoryDescription string," + + "RegionID string)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "territories.csv", "hive_territories", + beelineClientConnection, schema) + createHiveTable("hive_employee_territories(EmployeeID int," + + "TerritoryID string)", beelineClientConnection, schema) + loadDataToHiveTbls(dataLocation + "employee_territories.csv", + "hive_employee_territories", beelineClientConnection, schema) + } + + def createSnappyTblsAndLoadData(snc: SnappyContext, dataLocation: String, + schema: String = "app", hiveSchema: String="default"): Unit = { + snc.sql("create table if not exists " + schema + "." + "snappy_regions using row" + + " as select * from " + hiveSchema + "." + "hive_regions") + snc.sql("create table if not exists " + schema + "." + "snappy_categories using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_categories") + snc.sql("create table if not exists " + schema + "." + "snappy_shippers using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_shippers") + snc.sql("create table if not exists " + schema + "." + "snappy_employees using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_employees") + snc.sql("create table if not exists " + schema + "." + "snappy_customers using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_customers") + snc.sql("create table if not exists " + schema + "." + "snappy_orders using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_orders") + snc.sql("create table if not exists " + schema + "." + "snappy_order_details using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_order_details") + snc.sql("create table if not exists " + schema + "." + "snappy_products using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_products") + snc.sql("create table if not exists " + schema + "." + "snappy_suppliers using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_suppliers") + snc.sql("create table if not exists " + schema + "." + "snappy_territories using column" + + " options(BUCKETS '8') as select * from " + hiveSchema + "." + "hive_territories") + snc.sql("create table if not exists " + schema + "." + + "snappy_employee_territories " + + "as select * from " + hiveSchema + "." + "hive_employee_territories") + } + + def executeQueries(snc: SnappyContext, query1: String, query2: String, pw: PrintWriter, + index: Int, id : Int): Unit = { + var isDiff1: Boolean = false + var isDiff2: Boolean = false + pw.println("Query" + index + " : " + query1) + val df1 = snc.sql(query1) + if(id == 0) { + pw.println("Hive Query executed from Snappy count: " + df1.count()) + } + if(id ==1) { + pw.println("Hive Join Snappy Count: " + df1.count()) + } + val df2 = snc.sql(query2) + if(id == 0) { + pw.println("Snappy Query Count (Validation) : " + df2.count()) + } + if(id == 1) { + pw.println("Snappy Join Snappy Count (Validation) : " + df2.count()) + } + val diff1 = df1.except(df2) + if (diff1.count() > 0) { + diff1.write.csv("file:///" + + System.getProperty("user.dir") + "/diff1_" + id + "_" + index + ".csv") + } else { + isDiff1 = true + } + val diff2 = df2.except(df1) + if (diff2.count() > 0) { + diff2.write.csv("file:///" + + System.getProperty("user.dir") + "/diff2_" + id + "_" + index + ".cvs") + } else { + isDiff2 = true + } + if (isDiff1 && isDiff2) { + if (id == 0) { + pw.println("For Query " + index + " Hive query Passed.") + } + if(id == 1) { + pw.println("For Query " + index + " Join between Hive and Snappy is Passed.") + } + } + else { + if (id == 0) { + pw.println("For Query " + index + " Hive Query execution is not successful") + } + if(id == 1) { + pw.println("For Query " + index + " Join between Hive and Snappy is not successful") + } + } + isDiff1 = false + isDiff2 = false + pw.println("* * * * * * * * * * * * * * * * * * * * * * * * *") + } + + def alterHiveTable_ChangeTableName(snc: SnappyContext, pw: PrintWriter): Unit = { + snc.sql(HiveMetaStoreUtils.dropTable + "default.Table1") + snc.sql(HiveMetaStoreUtils.dropTable + "default.Table2") + snc.sql("create table if not exists default.Table1(id int, name String) row format delimited fields terminated by ','") + // snc.sql("insert into default.Table1 select id, concat('TIBCO_',id) from range(100000)") + snc.sql("alter table default.Table1 rename to default.Table2") + val countDF = snc.sql("select count(*) as Total from default.Table2") + println("countDF : " + countDF.head()) + val count = countDF.head().toString() + .replace("[", "") + .replace("]", "").toLong + if (count.==(100000)) { + pw.println("Create the table in beeline from snappy," + + " \n insert data into it from snappy," + + " \n rename the table name from snappy," + + " \n count the no. of records from snappy and " + + "dropping the beeline table from snappy" + + "\n is successful") + pw.println("Alter table test passed.") + } + pw.println("* * * * * * * * * * * * * * * * * * * * * * * * *") + snc.dropTable("default.Table1", true) + snc.dropTable("default.Table2", true) + } + + def createAndDropHiveSchema(snc: SnappyContext, beelineClientConnection: Connection, + dataLocation: String, pw: PrintWriter): Unit = { + var isDiff1 = false + var isDiff2 = false + snc.sql(HiveMetaStoreUtils.dropTable + "hiveDB.hive_regions") + snc.sql(HiveMetaStoreUtils.dropTable + "snappyDB.staging_regions") + snc.sql(HiveMetaStoreUtils.dropTable + "snappyDB.snappy_regions") + snc.sql("drop database if exists hiveDB") + snc.sql("drop schema if exists snappyDB") + snc.sql("create database hiveDB") + snc.sql(HiveMetaStoreUtils.setSnappyInBuiltCatalog) + snc.sql("create schema snappyDB") + snc.sql(HiveMetaStoreUtils.setExternalHiveCatalog) + createHiveTable("hive_regions(RegionID int,RegionDescription string)", beelineClientConnection, + "hiveDB") + loadDataToHiveTbls(dataLocation + "regions.csv", "hive_regions", beelineClientConnection, "hiveDB") + snc.sql("create external table if not exists snappyDB.staging_regions using csv" + + " options(path '" + "file:///" + dataLocation + "regions.csv" + "',header 'true')") + snc.sql("create table if not exists snappyDB.snappy_regions using column" + + " options(BUCKETS '10') as select * from snappyDB.staging_regions") + val df1 = snc.sql("select * from hiveDB.hive_regions " + + "where RegionDescription <> 'RegionDescription'") + pw.println("Hive Table Count : " + df1.count()) + val df2 = snc.sql("select * from snappyDB.snappy_regions") + pw.println("Snappy Table Count : " + df2.count()) + val diff1 = df1.except(df2) + if (diff1.count() > 0) { + diff1.write.csv("file:///" + + System.getProperty("user.dir") + "/diff1_HiveTable" + ".cvs") + } else { + isDiff1 = true + } + val diff2 = df2.except(df1) + if (diff2.count() > 0) { + diff1.write.csv("file:///" + + System.getProperty("user.dir") + "/diff1_SnappyTable" + ".cvs") + } else { + isDiff2 = true + } + if (isDiff1 && isDiff2) { + pw.println("Hive Table is same as Snappy Table") + } + else { + pw.println("Hive Table is not same as Snappy Table") + } + isDiff1 = false + isDiff2 = false + pw.println("* * * * * * * * * * * * * * * * * * * * * * * * *") + snc.sql(HiveMetaStoreUtils.dropTable + "hiveDB.hive_regions") + snc.sql(HiveMetaStoreUtils.dropTable + "snappyDB.staging_regions") + snc.sql(HiveMetaStoreUtils.dropTable + "snappyDB.snappy_regions") + snc.sql("drop database if exists hiveDB") + snc.sql(HiveMetaStoreUtils.setSnappyInBuiltCatalog) + snc.sql("drop schema if exists snappyDB") + snc.sql(HiveMetaStoreUtils.setExternalHiveCatalog) + } + + def executeQueriesOnHiveTables(snc : SnappyContext, beelineClientConnection : Connection, + dataLocation : String, pw : PrintWriter): Unit = { + for(index <- 0 to HiveMetaStoreUtils.beeLineQueries.length-1) { + executeQueries(snc, HiveMetaStoreUtils.beeLineQueries(index), + HiveMetaStoreUtils.snappyQueries(index), pw, index, 0) + } + } + + def executeJoinQueriesOnHiveAndSnappy(snc : SnappyContext, beelineClientConnection : Connection, + dataLocation : String, pw : PrintWriter) : Unit = { + for (index <- 0 to 4) { + executeQueries(snc, HiveMetaStoreUtils.joinHiveSnappy(index), + HiveMetaStoreUtils.validateJoin(index), pw, index, 1) + pw.flush() + } + } +}