-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUtilizandoGoogleCloudBigQueryAPIemPython.html
More file actions
1 lines (1 loc) · 32.7 KB
/
UtilizandoGoogleCloudBigQueryAPIemPython.html
File metadata and controls
1 lines (1 loc) · 32.7 KB
1
<html><head><meta content="text/html; charset=UTF-8" http-equiv="content-type"><style type="text/css">@import url('https://themes.googleusercontent.com/fonts/css?kit=cJLRyNNdbfauG58nyHg_9wuQ5R8Gs8wPIXagm79fmK39ntW2cqulOpANAVLNlq10');ol.lst-kix_r5s6nlbf0nh9-6.start{counter-reset:lst-ctn-kix_r5s6nlbf0nh9-6 0}.lst-kix_pirtr0g56kyq-0>li{counter-increment:lst-ctn-kix_pirtr0g56kyq-0}.lst-kix_r5s6nlbf0nh9-4>li{counter-increment:lst-ctn-kix_r5s6nlbf0nh9-4}ol.lst-kix_r5s6nlbf0nh9-3.start{counter-reset:lst-ctn-kix_r5s6nlbf0nh9-3 0}.lst-kix_l1iazbqynlvt-7>li{counter-increment:lst-ctn-kix_l1iazbqynlvt-7}.lst-kix_r5s6nlbf0nh9-5>li{counter-increment:lst-ctn-kix_r5s6nlbf0nh9-5}.lst-kix_pirtr0g56kyq-0>li:before{content:"" counter(lst-ctn-kix_pirtr0g56kyq-0,decimal) ". "}.lst-kix_pirtr0g56kyq-1>li:before{content:"" counter(lst-ctn-kix_pirtr0g56kyq-1,lower-latin) ". "}.lst-kix_r5s6nlbf0nh9-8>li:before{content:"" counter(lst-ctn-kix_r5s6nlbf0nh9-8,lower-roman) ". "}ol.lst-kix_pirtr0g56kyq-2{list-style-type:none}ol.lst-kix_pirtr0g56kyq-1{list-style-type:none}.lst-kix_r5s6nlbf0nh9-7>li:before{content:"" counter(lst-ctn-kix_r5s6nlbf0nh9-7,lower-latin) ". "}ol.lst-kix_pirtr0g56kyq-0{list-style-type:none}.lst-kix_r5s6nlbf0nh9-6>li{counter-increment:lst-ctn-kix_r5s6nlbf0nh9-6}.lst-kix_r5s6nlbf0nh9-6>li:before{content:"" counter(lst-ctn-kix_r5s6nlbf0nh9-6,decimal) ". "}ol.lst-kix_maf6ya59b0cy-4.start{counter-reset:lst-ctn-kix_maf6ya59b0cy-4 0}ol.lst-kix_pirtr0g56kyq-8.start{counter-reset:lst-ctn-kix_pirtr0g56kyq-8 0}ol.lst-kix_r5s6nlbf0nh9-0.start{counter-reset:lst-ctn-kix_r5s6nlbf0nh9-0 0}.lst-kix_r5s6nlbf0nh9-4>li:before{content:"" counter(lst-ctn-kix_r5s6nlbf0nh9-4,lower-latin) ". "}.lst-kix_r5s6nlbf0nh9-3>li:before{content:"" counter(lst-ctn-kix_r5s6nlbf0nh9-3,decimal) ". "}.lst-kix_r5s6nlbf0nh9-5>li:before{content:"" counter(lst-ctn-kix_r5s6nlbf0nh9-5,lower-roman) ". "}ol.lst-kix_l1iazbqynlvt-2.start{counter-reset:lst-ctn-kix_l1iazbqynlvt-2 0}ol.lst-kix_maf6ya59b0cy-1.start{counter-reset:lst-ctn-kix_maf6ya59b0cy-1 0}.lst-kix_l1iazbqynlvt-8>li{counter-increment:lst-ctn-kix_l1iazbqynlvt-8}.lst-kix_o4os2pwyv7w2-7>li:before{content:"\0025cb "}.lst-kix_pirtr0g56kyq-1>li{counter-increment:lst-ctn-kix_pirtr0g56kyq-1}.lst-kix_l1iazbqynlvt-5>li{counter-increment:lst-ctn-kix_l1iazbqynlvt-5}.lst-kix_o4os2pwyv7w2-6>li:before{content:"\0025cf "}.lst-kix_o4os2pwyv7w2-8>li:before{content:"\0025a0 "}ol.lst-kix_pirtr0g56kyq-5.start{counter-reset:lst-ctn-kix_pirtr0g56kyq-5 0}ol.lst-kix_pirtr0g56kyq-8{list-style-type:none}ol.lst-kix_pirtr0g56kyq-7{list-style-type:none}ol.lst-kix_pirtr0g56kyq-6{list-style-type:none}ol.lst-kix_l1iazbqynlvt-5.start{counter-reset:lst-ctn-kix_l1iazbqynlvt-5 0}ol.lst-kix_pirtr0g56kyq-5{list-style-type:none}.lst-kix_r5s6nlbf0nh9-3>li{counter-increment:lst-ctn-kix_r5s6nlbf0nh9-3}ol.lst-kix_pirtr0g56kyq-4{list-style-type:none}ol.lst-kix_pirtr0g56kyq-3{list-style-type:none}ol.lst-kix_r5s6nlbf0nh9-0{list-style-type:none}ol.lst-kix_r5s6nlbf0nh9-1{list-style-type:none}ol.lst-kix_r5s6nlbf0nh9-2{list-style-type:none}ol.lst-kix_r5s6nlbf0nh9-3{list-style-type:none}ol.lst-kix_r5s6nlbf0nh9-4{list-style-type:none}.lst-kix_pirtr0g56kyq-3>li{counter-increment:lst-ctn-kix_pirtr0g56kyq-3}ol.lst-kix_r5s6nlbf0nh9-5{list-style-type:none}ol.lst-kix_r5s6nlbf0nh9-6{list-style-type:none}ol.lst-kix_r5s6nlbf0nh9-7{list-style-type:none}ol.lst-kix_l1iazbqynlvt-8.start{counter-reset:lst-ctn-kix_l1iazbqynlvt-8 0}ol.lst-kix_r5s6nlbf0nh9-8{list-style-type:none}ol.lst-kix_pirtr0g56kyq-2.start{counter-reset:lst-ctn-kix_pirtr0g56kyq-2 0}ol.lst-kix_r5s6nlbf0nh9-1.start{counter-reset:lst-ctn-kix_r5s6nlbf0nh9-1 0}.lst-kix_r5s6nlbf0nh9-7>li{counter-increment:lst-ctn-kix_r5s6nlbf0nh9-7}.lst-kix_r5s6nlbf0nh9-1>li{counter-increment:lst-ctn-kix_r5s6nlbf0nh9-1}ol.lst-kix_r5s6nlbf0nh9-8.start{counter-reset:lst-ctn-kix_r5s6nlbf0nh9-8 0}.lst-kix_l1iazbqynlvt-0>li{counter-increment:lst-ctn-kix_l1iazbqynlvt-0}ol.lst-kix_l1iazbqynlvt-1.start{counter-reset:lst-ctn-kix_l1iazbqynlvt-1 0}.lst-kix_maf6ya59b0cy-5>li{counter-increment:lst-ctn-kix_maf6ya59b0cy-5}.lst-kix_l1iazbqynlvt-3>li{counter-increment:lst-ctn-kix_l1iazbqynlvt-3}.lst-kix_maf6ya59b0cy-2>li{counter-increment:lst-ctn-kix_maf6ya59b0cy-2}ol.lst-kix_r5s6nlbf0nh9-2.start{counter-reset:lst-ctn-kix_r5s6nlbf0nh9-2 0}.lst-kix_l1iazbqynlvt-6>li{counter-increment:lst-ctn-kix_l1iazbqynlvt-6}ol.lst-kix_l1iazbqynlvt-7.start{counter-reset:lst-ctn-kix_l1iazbqynlvt-7 0}ol.lst-kix_l1iazbqynlvt-0.start{counter-reset:lst-ctn-kix_l1iazbqynlvt-0 0}ol.lst-kix_pirtr0g56kyq-3.start{counter-reset:lst-ctn-kix_pirtr0g56kyq-3 0}ol.lst-kix_maf6ya59b0cy-3.start{counter-reset:lst-ctn-kix_maf6ya59b0cy-3 0}.lst-kix_maf6ya59b0cy-8>li{counter-increment:lst-ctn-kix_maf6ya59b0cy-8}ol.lst-kix_pirtr0g56kyq-7.start{counter-reset:lst-ctn-kix_pirtr0g56kyq-7 0}ol.lst-kix_maf6ya59b0cy-5.start{counter-reset:lst-ctn-kix_maf6ya59b0cy-5 0}ol.lst-kix_l1iazbqynlvt-3.start{counter-reset:lst-ctn-kix_l1iazbqynlvt-3 0}.lst-kix_maf6ya59b0cy-4>li{counter-increment:lst-ctn-kix_maf6ya59b0cy-4}.lst-kix_l1iazbqynlvt-1>li{counter-increment:lst-ctn-kix_l1iazbqynlvt-1}ol.lst-kix_l1iazbqynlvt-6.start{counter-reset:lst-ctn-kix_l1iazbqynlvt-6 0}.lst-kix_pirtr0g56kyq-5>li{counter-increment:lst-ctn-kix_pirtr0g56kyq-5}ol.lst-kix_pirtr0g56kyq-4.start{counter-reset:lst-ctn-kix_pirtr0g56kyq-4 0}ol.lst-kix_maf6ya59b0cy-2.start{counter-reset:lst-ctn-kix_maf6ya59b0cy-2 0}.lst-kix_maf6ya59b0cy-3>li{counter-increment:lst-ctn-kix_maf6ya59b0cy-3}.lst-kix_pirtr0g56kyq-6>li{counter-increment:lst-ctn-kix_pirtr0g56kyq-6}.lst-kix_r5s6nlbf0nh9-0>li{counter-increment:lst-ctn-kix_r5s6nlbf0nh9-0}ol.lst-kix_pirtr0g56kyq-1.start{counter-reset:lst-ctn-kix_pirtr0g56kyq-1 0}ol.lst-kix_maf6ya59b0cy-0{list-style-type:none}ol.lst-kix_maf6ya59b0cy-1{list-style-type:none}ol.lst-kix_maf6ya59b0cy-2{list-style-type:none}ol.lst-kix_r5s6nlbf0nh9-7.start{counter-reset:lst-ctn-kix_r5s6nlbf0nh9-7 0}.lst-kix_pirtr0g56kyq-7>li{counter-increment:lst-ctn-kix_pirtr0g56kyq-7}ol.lst-kix_maf6ya59b0cy-8.start{counter-reset:lst-ctn-kix_maf6ya59b0cy-8 0}ol.lst-kix_r5s6nlbf0nh9-4.start{counter-reset:lst-ctn-kix_r5s6nlbf0nh9-4 0}.lst-kix_maf6ya59b0cy-1>li{counter-increment:lst-ctn-kix_maf6ya59b0cy-1}ol.lst-kix_maf6ya59b0cy-7{list-style-type:none}ol.lst-kix_maf6ya59b0cy-8{list-style-type:none}.lst-kix_pirtr0g56kyq-4>li{counter-increment:lst-ctn-kix_pirtr0g56kyq-4}ol.lst-kix_maf6ya59b0cy-3{list-style-type:none}.lst-kix_l1iazbqynlvt-2>li{counter-increment:lst-ctn-kix_l1iazbqynlvt-2}ol.lst-kix_maf6ya59b0cy-4{list-style-type:none}ol.lst-kix_maf6ya59b0cy-5{list-style-type:none}ol.lst-kix_maf6ya59b0cy-6{list-style-type:none}.lst-kix_o4os2pwyv7w2-3>li:before{content:"\0025cf "}ul.lst-kix_o4os2pwyv7w2-7{list-style-type:none}ul.lst-kix_o4os2pwyv7w2-6{list-style-type:none}.lst-kix_o4os2pwyv7w2-2>li:before{content:"\0025a0 "}.lst-kix_o4os2pwyv7w2-4>li:before{content:"\0025cb "}ul.lst-kix_o4os2pwyv7w2-5{list-style-type:none}ul.lst-kix_o4os2pwyv7w2-4{list-style-type:none}.lst-kix_o4os2pwyv7w2-1>li:before{content:"\0025cb "}.lst-kix_o4os2pwyv7w2-5>li:before{content:"\0025a0 "}.lst-kix_l1iazbqynlvt-0>li:before{content:"" counter(lst-ctn-kix_l1iazbqynlvt-0,decimal) ". "}.lst-kix_l1iazbqynlvt-1>li:before{content:"" counter(lst-ctn-kix_l1iazbqynlvt-1,lower-latin) ". "}ol.lst-kix_l1iazbqynlvt-8{list-style-type:none}ol.lst-kix_l1iazbqynlvt-7{list-style-type:none}ol.lst-kix_l1iazbqynlvt-6{list-style-type:none}ul.lst-kix_o4os2pwyv7w2-8{list-style-type:none}.lst-kix_maf6ya59b0cy-6>li{counter-increment:lst-ctn-kix_maf6ya59b0cy-6}ol.lst-kix_l1iazbqynlvt-5{list-style-type:none}ol.lst-kix_l1iazbqynlvt-4{list-style-type:none}ol.lst-kix_maf6ya59b0cy-0.start{counter-reset:lst-ctn-kix_maf6ya59b0cy-0 0}ol.lst-kix_l1iazbqynlvt-3{list-style-type:none}ol.lst-kix_l1iazbqynlvt-2{list-style-type:none}.lst-kix_r5s6nlbf0nh9-2>li{counter-increment:lst-ctn-kix_r5s6nlbf0nh9-2}ol.lst-kix_l1iazbqynlvt-1{list-style-type:none}ul.lst-kix_o4os2pwyv7w2-3{list-style-type:none}ol.lst-kix_l1iazbqynlvt-0{list-style-type:none}ul.lst-kix_o4os2pwyv7w2-2{list-style-type:none}ul.lst-kix_o4os2pwyv7w2-1{list-style-type:none}ul.lst-kix_o4os2pwyv7w2-0{list-style-type:none}.lst-kix_r5s6nlbf0nh9-0>li:before{content:"" counter(lst-ctn-kix_r5s6nlbf0nh9-0,decimal) ". "}.lst-kix_l1iazbqynlvt-4>li{counter-increment:lst-ctn-kix_l1iazbqynlvt-4}.lst-kix_l1iazbqynlvt-7>li:before{content:"" counter(lst-ctn-kix_l1iazbqynlvt-7,lower-latin) ". "}.lst-kix_r5s6nlbf0nh9-1>li:before{content:"" counter(lst-ctn-kix_r5s6nlbf0nh9-1,lower-latin) ". "}.lst-kix_pirtr0g56kyq-2>li{counter-increment:lst-ctn-kix_pirtr0g56kyq-2}.lst-kix_maf6ya59b0cy-1>li:before{content:"" counter(lst-ctn-kix_maf6ya59b0cy-1,lower-latin) ". "}.lst-kix_r5s6nlbf0nh9-8>li{counter-increment:lst-ctn-kix_r5s6nlbf0nh9-8}.lst-kix_maf6ya59b0cy-7>li{counter-increment:lst-ctn-kix_maf6ya59b0cy-7}.lst-kix_r5s6nlbf0nh9-2>li:before{content:"" counter(lst-ctn-kix_r5s6nlbf0nh9-2,lower-roman) ". "}.lst-kix_l1iazbqynlvt-8>li:before{content:"" counter(lst-ctn-kix_l1iazbqynlvt-8,lower-roman) ". "}.lst-kix_maf6ya59b0cy-0>li:before{content:"" counter(lst-ctn-kix_maf6ya59b0cy-0,decimal) ". "}ol.lst-kix_l1iazbqynlvt-4.start{counter-reset:lst-ctn-kix_l1iazbqynlvt-4 0}.lst-kix_o4os2pwyv7w2-0>li:before{content:"\0025cf "}.lst-kix_maf6ya59b0cy-3>li:before{content:"" counter(lst-ctn-kix_maf6ya59b0cy-3,decimal) ". "}.lst-kix_maf6ya59b0cy-2>li:before{content:"" counter(lst-ctn-kix_maf6ya59b0cy-2,lower-roman) ". "}ol.lst-kix_maf6ya59b0cy-7.start{counter-reset:lst-ctn-kix_maf6ya59b0cy-7 0}.lst-kix_maf6ya59b0cy-0>li{counter-increment:lst-ctn-kix_maf6ya59b0cy-0}.lst-kix_pirtr0g56kyq-4>li:before{content:"" counter(lst-ctn-kix_pirtr0g56kyq-4,lower-latin) ". "}.lst-kix_maf6ya59b0cy-8>li:before{content:"" counter(lst-ctn-kix_maf6ya59b0cy-8,lower-roman) ". "}.lst-kix_pirtr0g56kyq-3>li:before{content:"" counter(lst-ctn-kix_pirtr0g56kyq-3,decimal) ". "}.lst-kix_pirtr0g56kyq-5>li:before{content:"" counter(lst-ctn-kix_pirtr0g56kyq-5,lower-roman) ". "}.lst-kix_maf6ya59b0cy-7>li:before{content:"" counter(lst-ctn-kix_maf6ya59b0cy-7,lower-latin) ". "}.lst-kix_pirtr0g56kyq-2>li:before{content:"" counter(lst-ctn-kix_pirtr0g56kyq-2,lower-roman) ". "}.lst-kix_pirtr0g56kyq-6>li:before{content:"" counter(lst-ctn-kix_pirtr0g56kyq-6,decimal) ". "}ol.lst-kix_pirtr0g56kyq-6.start{counter-reset:lst-ctn-kix_pirtr0g56kyq-6 0}.lst-kix_maf6ya59b0cy-4>li:before{content:"" counter(lst-ctn-kix_maf6ya59b0cy-4,lower-latin) ". "}.lst-kix_maf6ya59b0cy-5>li:before{content:"" counter(lst-ctn-kix_maf6ya59b0cy-5,lower-roman) ". "}ol.lst-kix_maf6ya59b0cy-6.start{counter-reset:lst-ctn-kix_maf6ya59b0cy-6 0}ol.lst-kix_r5s6nlbf0nh9-5.start{counter-reset:lst-ctn-kix_r5s6nlbf0nh9-5 0}.lst-kix_maf6ya59b0cy-6>li:before{content:"" counter(lst-ctn-kix_maf6ya59b0cy-6,decimal) ". "}.lst-kix_l1iazbqynlvt-6>li:before{content:"" counter(lst-ctn-kix_l1iazbqynlvt-6,decimal) ". "}.lst-kix_pirtr0g56kyq-8>li{counter-increment:lst-ctn-kix_pirtr0g56kyq-8}.lst-kix_l1iazbqynlvt-4>li:before{content:"" counter(lst-ctn-kix_l1iazbqynlvt-4,lower-latin) ". "}.lst-kix_l1iazbqynlvt-5>li:before{content:"" counter(lst-ctn-kix_l1iazbqynlvt-5,lower-roman) ". "}.lst-kix_pirtr0g56kyq-8>li:before{content:"" counter(lst-ctn-kix_pirtr0g56kyq-8,lower-roman) ". "}.lst-kix_l1iazbqynlvt-2>li:before{content:"" counter(lst-ctn-kix_l1iazbqynlvt-2,lower-roman) ". "}.lst-kix_l1iazbqynlvt-3>li:before{content:"" counter(lst-ctn-kix_l1iazbqynlvt-3,decimal) ". "}.lst-kix_pirtr0g56kyq-7>li:before{content:"" counter(lst-ctn-kix_pirtr0g56kyq-7,lower-latin) ". "}ol.lst-kix_pirtr0g56kyq-0.start{counter-reset:lst-ctn-kix_pirtr0g56kyq-0 0}ol{margin:0;padding:0}table td,table th{padding:0}.c1{margin-left:72pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:justify}.c18{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:13pt;font-family:"EB Garamond";font-style:normal}.c11{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:17pt;font-family:"Oswald";font-style:normal}.c3{padding-top:0pt;text-indent:36pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:justify}.c7{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:17pt;font-family:"Times New Roman";font-style:normal}.c2{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:15pt;font-family:"EB Garamond";font-style:normal}.c20{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c22{color:#000000;text-decoration:none;vertical-align:baseline;font-size:17pt;font-family:"Oswald";font-style:normal}.c5{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:justify}.c9{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:center}.c0{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c15{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;text-decoration:underline}.c6{background-color:#ffffff;max-width:451.4pt;padding:72pt 72pt 72pt 72pt}.c13{font-size:15pt;font-family:"EB Garamond";font-weight:400}.c4{padding:0;margin:0}.c19{color:inherit;text-decoration:inherit}.c16{margin-left:36pt;padding-left:0pt}.c8{height:15pt}.c14{margin-left:72pt}.c21{margin-left:36pt}.c17{text-indent:36pt}.c10{font-weight:700}.c12{page-break-after:avoid}.title{padding-top:0pt;color:#000000;font-size:17pt;padding-bottom:0pt;font-family:"Oswald";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:justify}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:justify}li{color:#000000;font-size:15pt;font-family:"EB Garamond"}p{margin:0;color:#000000;font-size:15pt;font-family:"EB Garamond"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"EB Garamond";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:justify}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"EB Garamond";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:justify}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"EB Garamond";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:justify}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"EB Garamond";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:justify}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"EB Garamond";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:justify}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"EB Garamond";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:justify}</style></head><body><div class="c6"><p class="c9 c12 title" id="h.bnk9gpd4jiwq"><span class="c10 c22">Utilizando Google Cloud BigQuery API em Python</span></p><p class="c5 c12 title" id="h.o2weyakt81vz"><span class="c11">Introdução</span></p><p class="c3"><span class="c13">Os serviços Google Cloud oferecem bibliotecas em diferentes linguagens para se comunicar com seus serviços, entre Java, C#, javascript, Ruby, PHP, C++, Go e Python. Em especial, será apresentado como criar tabelas para lidar com dados externamente (Google Drive), tabelas</span><span> </span><span class="c2">com dados carregados localmente (CSV) e tabelas geradas a partir de consultas em SQL padrão.</span></p><p class="c3 c8"><span class="c7"></span></p><p class="c5 c12 title" id="h.n7claup7h598"><span>Motivação</span></p><p class="c3"><span class="c13">Esse trabalho se deve ao fato de diariamente lidar com os comandos legados do BigQuery por meio de terminal shell, porém em certas situações sinto falta de maior liberdade para manipular o código e automatizar certas rotinas, como testes e constantes atualizações nas estruturas criadas.</span></p><p class="c3 c8"><span class="c2"></span></p><p class="c3"><span class="c13">Meu foco nesse pequeno artigo é explicar de forma simples quais objetos, métodos e atributos são necessários para criar uma arquitetura de tabelas que podem ser utilizadas na grande maioria dos contextos cotidianos.</span></p><p class="c3 c8"><span class="c2"></span></p><p class="c3"><span class="c2">O documento será dividido em 3 partes: </span></p><ul class="c4 lst-kix_o4os2pwyv7w2-0 start"><li class="c1"><span class="c2">Tabelas com fontes externas;</span></li><li class="c1"><span class="c2">Tabelas com fontes locais;</span></li><li class="c1"><span class="c2">Tabelas por meio de consultas SQL</span></li></ul><p class="c5 c8"><span class="c2"></span></p><p class="c3"><span>Grande parte da informação aqui condensada pode ser encontrada com mais detalhes na página oficinal da biblioteca. Disponível em: </span><span class="c0"><a class="c19" href="https://www.google.com/url?q=https://googleapis.dev/python/bigquery/latest/index.html&sa=D&ust=1605144119423000&usg=AOvVaw1xhuOFCfQhD9lmRzaM7_uj">https://googleapis.dev/python/bigquery/latest/index.html</a></span></p><p class="c5 c8"><span class="c7"></span></p><ol class="c4 lst-kix_l1iazbqynlvt-0 start" start="1"><li class="c5 c16 c12 title" id="h.1t9uu5vkkk93"><span class="c11">Tabela com dados Externos</span></li></ol><p class="c3"><span>É possível ter arquivos de dados armazenados no Cloud Storage ou Google Drive e executar consultas por meio da interface do Bigquery. Dessa forma é possível economizar recursos de armazenamento local do BigQuery, além de permitir a consulta esporádica de dados que não necessitam estar persistidos localmente.</span></p><p class="c3"><span class="c2">O exemplo a seguir utilizou Google Drive, já que a opção de utilizar Cloud Storage não está disponível sem ativar a opção de $300 dólares de créditos para testes durante 90 dias. Para utilizar Cloud Storage como teste é necessário adicionar informações sobre cartão de crédito e outros dados pessoais. O que pode inviabilizar alguém sem acesso a um cartão de crédito replicar o cenário.</span></p><p class="c5 c8 c21"><span class="c7"></span></p><p class="c5 c12 title" id="h.7vxbkykfob5c"><span class="c11">Passos:</span></p><ol class="c4 lst-kix_pirtr0g56kyq-0 start" start="1"><li class="c5 c12 c16 title" id="h.9g0fo3mel5rs"><span>Obter uma fonte de dados.</span></li></ol><p class="c3"><span class="c2">Para esse exemplo, baixei um arquivo com informações sobre a quantidade de dinheiro físico circulante no Brasil, entre o período de 1995 a 2013.</span></p><p class="c3"><span class="c2">O arquivo em formato csv está dividido em 4 colunas, sendo: data, tipo da moeda ou cédula, valor da moeda ou cédula e quantidade circulante. Escolhi esse arquivo por conter diferentes tipos de dados, como datas, descrições, quantidades tipo inteiro (INT64) e tipo fload (NUMERIC). O arquivo está disponível em: https://dados.gov.br/dataset/dinheiro-em-circulacao.</span></p><p class="c3 c8"><span class="c7"></span></p><ol class="c4 lst-kix_pirtr0g56kyq-0" start="2"><li class="c5 c16 c12 title" id="h.cezuv9qjpq0y"><span class="c15">Formatar URL para utilizar no BigQuery.</span><span class="c11"> </span></li></ol><p class="c3"><span class="c2">Ao baixar o arquivo CSV, faça update para o Google Drive e gere um link compartilhado do arquivo. O link deve ser semelhante ao apresentado abaixo:</span></p><p class="c5"><span class="c0"><a class="c19" href="https://www.google.com/url?q=https://drive.google.com/file/d/1qBntr4-o7G3nY4_OomLoNdA7EUrV00nG/view?usp%3Dsharing&sa=D&ust=1605144119424000&usg=AOvVaw1Cl6JtYmbnVplJk2Wp7UbG">https://drive.google.com/file/d/1qBntr4-o7G3nY4_OomLoNdA7EUrV00nG/view?usp=sharing</a></span></p><p class="c5 c8"><span class="c2"></span></p><p class="c5"><span class="c2">Copie a parte em negrito e formate uma URL com o seguinte formato:</span></p><p class="c5 c8"><span class="c2"></span></p><p class="c5"><span class="c2">https://drive.google.com/open?id=1qBntr4-o7G3nY4_OomLoNdA7EUrV00nG </span></p><p class="c5 c8"><span class="c2"></span></p><p class="c3"><span class="c2">Esse formato de URL é o padrão utilizado pelo BigQuery para acessar arquivos no Google Drive.</span></p><p class="c5 c8 c14"><span class="c7"></span></p><ol class="c4 lst-kix_pirtr0g56kyq-0" start="3"><li class="c5 c16 c12 title" id="h.ajmvb9e63gbw"><span class="c11">O código</span></li></ol><p class="c5 c8"><span class="c7"></span></p><p class="c3"><span class="c2">Estando o arquivo disponível é hora de escrever nosso pequeno código responsável por criar a tabela que irá permitir ler os dados.</span></p><p class="c3 c8"><span class="c2"></span></p><p class="c3"><span class="c2">Abaixo segue trecho do código comentado.</span></p><p class="c5 c8"><span class="c7"></span></p><ol class="c4 lst-kix_pirtr0g56kyq-0" start="4"><li class="c5 c16 c12 title" id="h.azsz6bhtbow5"><span class="c11">Utilizando a interface gráfica.</span></li></ol><p class="c5 c8"><span class="c7"></span></p><p class="c3"><span class="c2">Feito isso, vá ao painel do BigQuery e sua tabela se encontrará criada. Para fazer a consulta, clique em “consultar tabela”, complete a query com os campos desejados e finalize clicando em “executar”.</span></p><p class="c5 c8 c14"><span class="c7"></span></p><p class="c3"><span class="c2">Caso seu arquivo não tenha nem um erro de quebra de linhas, linhas “dentadas” - com menos campos que o esperado ou problemas com encoding, o resultado deve estar disponível na tela. Infelizmente essa não foi a situação ideal.</span></p><p class="c3 c8"><span class="c2"></span></p><p class="c3"><span class="c2">Segue abaixo um erro que me deparei com esse arquivo e como corrigi-lo:</span></p><p class="c5 c8 c14"><span class="c7"></span></p><p class="c5 c12 title" id="h.k3k7hliciba1"><span class="c11">Problema 1:</span></p><p class="c3"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 602.00px; height: 281.34px;"><img alt="" src="images/image4.png" style="width: 602.00px; height: 339.38px; margin-left: 0.00px; margin-top: -39.38px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c3 c8"><span class="c7"></span></p><p class="c3"><span class="c2">Em minha experiência, erros relacionados a “column position” em arquivos externos, normalmente são gerados por linhas com um número de delimitadores fora do esperado, caracteres nulos da tabela ASCII ou quebra de linhas de sistema DOS. Caso a consulta seja feita com certo limite de linhas esse erro não é apresentado, porém é apresentado quando se executa uma consulta por todo o arquivo ou tentar carregá-lo em uma tabela interna.</span></p><p class="c3"><span class="c2"><br> Para contornar esse problema via linha de código é necessário setar o atributo --max_bad_records disponível nos comandos do BigQuery. Que permite ignorar determinado número de “bad lines” de um arquivo.<br><br> Outra forma mais correta, porém trabalhosa, seria corrigir o arquivo de origem. A melhor escolha vai depender da importância dos registros que estão sendo tratados. Já que ignorar “bad lines” é ignorar toda a linha do registro.</span></p><p class="c3 c8"><span class="c2"></span></p><p class="c3"><span class="c2">No exemplo preferi abrir o arquivo e foi como esperava. As duas últimas linhas do arquivo não tinham delimitadores. Dessa forma, apaguei deixando o cursor no final da última linha, carreguei novamente e o problema foi sanado.</span></p><p class="c3"><span class="c2">Para efeitos didáticos acabei testando as duas formas e ambas foram efetivas.</span></p><p class="c3 c8"><span class="c7"></span></p><p class="c3"><span class="c2">[colocar código corrigido]</span></p><p class="c5 c8"><span class="c7"></span></p><p class="c5 c12 title" id="h.qtbmlvvg63vs"><span class="c11">2. Tabelas com fontes locais</span></p><p class="c20 c17"><span class="c2">Infelizmente o BigQuery para teste em sua versão gratuita não permite criar tabelas por meio de consultas em tabelas externas. Mas na versão de teste com créditos ou paga é possível fazer querys diretamente em sua tabela externa e criar uma nova tabela com os dados persistidos já transformador.</span></p><p class="c20 c17"><span class="c2">Nesse exemplo, primeiramente criei uma tabela interna sem transformar os dados, fazendo update manualmente do arquivo.</span></p><p class="c17 c20"><span>Uma surpresa que tive ao utilizar a versão grátis é o limite de update do arquivo. Não me lembro se isso também acontece na versão paga, porém é permitido apenas 10mb. Para contornar esse problema utilizei a função </span><span class="c10">Split</span><span class="c2"> do shell, já que utilizo SO linux. Com esse comando é possível dividir o arquivo original de quase 25mb para tamanhos fixos de escolha.<br> Ao fazer o split é necessário corrigir as primeiras e últimas linhas do arquivo, para corrigir possíveis erros de bad records em sua carga.</span></p><p class="c20 c17"><span><br></span><span class="c10">OBS:</span><span class="c2"> Não pesquisei a fundo, mas imagino que exista uma combinação de flags do comando split para sanar esse problema da quebra de linhas ao dividir o arquivo. Também é possível utilizar o método chunksize da biblioteca Pandas em Python.</span></p><p class="c20 c17"><span class="c2">Abaixo segue alguns prints dos passos necessários para fazer uma carga manual por meio da interface gráfica.<br> Essa abordagem não é ideal. Em cenários reais seria inviável carregar manual centenas de arquivos de diferentes fontes. Nesses casos, a estratégia de update no Google Cloud Storage por meio de scripts automatizados e consultas em tabelas externas é recomendado.</span></p><p class="c20 c8 c17"><span class="c18"></span></p><p class="c9 c17"><span class="c18">Figura 1 - Criar tabela</span><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 601.70px; height: 337.33px;"><img alt="" src="images/image3.png" style="width: 601.70px; height: 337.33px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c9 c8 c17"><span class="c18"></span></p><p class="c20 c8"><span class="c2"></span></p><p class="c9"><span class="c2">Figura 2 - Escolher arquivo</span></p><p class="c9"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 601.70px; height: 334.67px;"><img alt="" src="images/image2.png" style="width: 601.70px; height: 334.67px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c9"><span class="c2">Figura 3 - Configurar Schema</span></p><p class="c9"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 601.70px; height: 336.00px;"><img alt="" src="images/image5.png" style="width: 601.70px; height: 336.00px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c20 c8 c17"><span class="c2"></span></p><p class="c9"><span class="c2">Figura 4 - Configurar Delimitador</span></p><p class="c20"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 601.70px; height: 338.67px;"><img alt="" src="images/image6.png" style="width: 601.70px; height: 338.67px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c20 c8"><span class="c2"></span></p><p class="c20 c8"><span class="c2"></span></p><p class="c20 c8"><span class="c2"></span></p><p class="c20 c8"><span class="c2"></span></p><p class="c9"><span class="c2">Figura 5 - Finalizar</span></p><p class="c20"><span style="overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 601.70px; height: 329.33px;"><img alt="" src="images/image1.png" style="width: 601.70px; height: 329.33px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></p><p class="c20 c8"><span class="c2"></span></p><p class="c5 c12 title" id="h.r27e893betiv"><span class="c11">3. Tabelas por meio de consultas SQL</span></p><p class="c3"><span class="c2">Com os dados disponíveis é hora de tratá-los para futuras análises. No BigQuery é possível o processo de transformação por meio de linguagem SQL padrão. Pensando em um conceito de ELT (Extract, Load then Transforme) a transformação é feita por meio de querys em SQL padrão por permitir maior conjunto de funções e curta curta de aprendizagem.</span></p><p class="c3"><span class="c2">Nesse exemplo utilizei uma UDF - User Defined Function - opção de funções na linguagem SQL. Como tratativa, foi construída uma pequena função utilizando sucessivos regexp_replaces para tratar caracteres especiais. Dessa forma, prevenimos possíveis erros de encoding quando os dados forem consumidos por uma interfaces externa, como uma programa de visualização (Power BI e Tableau).</span></p><p class="c3"><span>Para formar os diferentes agrupamentos de caracteres da função, utilizei o site: </span><span class="c0"><a class="c19" href="https://www.google.com/url?q=https://www.utf8-chartable.de/unicode-utf8-table.pl?utf8%3Dstring-literal&sa=D&ust=1605144119429000&usg=AOvVaw2NmOm14Q_hNeYQvqTty0Ny">https://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=string-literal</a></span><span class="c2">.</span></p><p class="c3"><span class="c2">Para mais informações de como funcionam as funções de regex em SQL padrão do BigQuery consulte:</span></p><p class="c3"><span class="c0"><a class="c19" href="https://www.google.com/url?q=https://github.com/google/re2/wiki/Syntax&sa=D&ust=1605144119430000&usg=AOvVaw0jHmJunlN3GIfNhXvInyed">https://github.com/google/re2/wiki/Syntax</a></span></p><p class="c3"><span class="c2">Abaixo temos o código comentado com exemplo:</span></p><p class="c3 c8"><span class="c2"></span></p><p class="c3"><span class="c2">[colocar código]</span></p><p class="c3 c8"><span class="c2"></span></p><p class="c3 c8"><span class="c2"></span></p><p class="c3 c8"><span class="c2"></span></p><p class="c3"><span class="c2">Por fim, essas são apenas algumas formas básicas de trabalhar com tabelas no BigQuery. Existe dezenas de formas de construir tabelas, seja por meio de consultas DDL, comandos legados e APIs em outras linguagem. Tentei condensar aqui um conteúdo que na documentação oficial estaria em diferentes partes, mesmo que bem direta, com exemplos e de simples leitura, pode acabar tomando um certo tempo do iniciante que não sabe por onde começar.</span></p><p class="c3 c8"><span class="c2"></span></p><p class="c3"><span class="c2">Agradeço a leitura e não deixe de compartilhar ; )</span></p></div></body></html>