æåã«ãå éšè£œåA1ã«ããã°ã©ã ã§ããŒã¿ãœãŒã¹ãåéããããããTableau Serverã«å ¬éããããã«æããååŸã®ãããã»ã¹ãã©ã®ããã«ãªã£ãŠããããç°¡åã«èª¬æããŸããæ¬¡ã«ãBIã³ãã³ãã®åé¡ãšèŠã€ãã£ã解決çã詳ãã調ã¹ãå éšã調ã¹ãŸãïŒããã§ã¯ã.hyperãã¡ã€ã«ã®äœæãtableauãµãŒããŒã§ã®ãã¡ã€ã«ã®å ¬éãããã³ãã€ããŒã®æŽæ°ã«ã€ããŠèª¬æããŸãïŒãç«ãžããããïŒ

ç§ãã¡DANåºåã°ã«ãŒãã¯ãã¡ãã£ã¢åžå Žã®ç£æ¥çšã¡ãŒã¿ãŒã§ããMediascopeããã®åºåç£èŠããŒã¿ã䜿çšããŠå€ãã®äœæ¥ãè¡ã£ãŠããŸããããŸããŸãªã·ããªãªããããŸããçããŒã¿ãã¢ããããŒãããåŸæ¥å¡ãããã°ãæ¢è£œã®ååŠçæžã¿ããŒã¿ããŒã¹ã䜿çšããåŸæ¥å¡ãããã°ããã®ããŒã¿ã«åºã¥ããŠèªåããã·ã¥ããŒãã®éçºã泚æããåŸæ¥å¡ãããŸããæåŸã®ã·ããªãªã«ã€ããŠè©³ãã説æããŸããããBIéçºè ã¯Tableauã§ããã·ã¥ããŒããåéããŸããããæç»ããéå§ããåã«ãéçºã«äŸ¿å©ãªç®çã®åœ¢åŒã«ããŒã¿ãç§»åããå¿ èŠããããŸãã
åææããçŸããèªåã°ã©ããŸã§ã®ããŒã¿ã®ã©ã€ããã¹ã¯ã倧ãã4ã€ã®ã¹ãããã«åããããšãã§ããŸãã
- çããŒã¿ã®ååŸ
- ããŒã¿ã®ã¯ãªãŒãã³ã°ãšæ¹èš
- Tableauã®ããŒã¿ãœãŒã¹ã®äœæ
- èŠèŠåã®éçº
ããã ã£ã
Tableauã®ããŒã¿ãœãŒã¹ãããã°ã©ã ã§çæããæ¹æ³ãåŠã¶åã¯ãããã»ã¹ã¯æ¬¡ã®ããã«ãªããŸããã

1.çããŒã¿ã®ååŸ
ãŠãŒã¶ãŒã¯ãå éšããŒã«A1ã䜿çšããŠè¡šåœ¢åŒã®ã¬ããŒããçæããŸããããã«ã€ããŠã¯ã以äžã§è©³ãã説æããŸãã
2.ããŒã¿ã®ã¯ãªãŒãã³ã°ãšå€æŽããŒã¿
倿æ©èœãA1ããŒã«ã«å«ãŸããŠããŸãããã®åŸãã¯ãªãŒã³ã¢ãããããããŒã¿ãxslx / csvã«ã¢ããããŒãããŠãããŒã«ã®å€éšã§åŒãç¶ãäœæ¥ã§ããŸããããã§æ³šç®ã«å€ããã®ã¯ãäžéšã®ãŠãŒã¶ãŒã¯èªåèªèº«ã1çªç®ã®ãã€ã³ãã«å¶éããã¬ããŒããã¢ããããŒãããåŸãèªåã§ããŒã¿ã倿Žããããšã§ãã
3.Tableauã®ããŒã¿ãœãŒã¹ãäœæãã
以åã¯ãããã·ã¥ããŒãã®ã客æ§ã«ã¯ãåã®æ®µèœã§çæããäžé£ã®Excelãä»å±ããŠããŸããããããŠãBIéçºè ã¯ããããã®å ã®äœåãç¬èªã®åäžã®ããŒã¿ãœãŒã¹ïŒã¿ããã€ãã¹ã©ã³ã°ïŒã«æã¡èŸŒã¿ãŸããã TableauããŒã«ã ãã«éå®ããããšãåžžã«å¯èœã§ãããšã¯éããŸããã§ããã圌ãã¯ãã°ãã°Pythonã§ã¹ã¯ãªãããäœæããŸããã
4.ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ã®éçº
æåŸã«ãæ°·å±±ã®äžè§ã¯ããã·ã¥ããŒããäœæãããããTableau Serverã«å ¬éããŠã顧客ããããèŠãããšãã§ããããã«ããããšã§ããå®éã«ã¯ãã¬ã³ããªã³ã°ã¯ãããŒã¿ãåéããŠæŽæ°ãèšå®ãããããæéãããããªãããšããããããŸãã
ã«ã¹ã¿ã ãœãªã¥ãŒã·ã§ã³ã®æ°ãå¢ããã«ã€ãã3çªç®ã®ã¹ãããã§èŠçãèç©ããŸããããããã¯ç¶æãšå®è£ ã«è²»çšãããããŸããããŸãã2çªç®ã®ã¹ãããã®ããŒã¿ã®ãšã©ãŒã宿çã«ãªãŒã¯ãããŠããŸããã2ã€ã®ã·ã¹ãã ïŒA1ãšTableauïŒã®äžéã®ExcelãããŠãŒã¶ãŒã«ããã³ã§äœããä¿®æ£ããŸããããèª°ãæ°ä»ããªãã§ãããããšããã·ã¥ããŠããŸããã
ã«ãªã£ã
äž»ãªã¿ã¹ã¯ã¯ãã¹ããã2ãš3ã®éã®äœåãªæ¯ç®ãæé€ããããšã§ããããã®çµæãA1ã«ããŒã¿ãœãŒã¹ãåéããŠTableauServerã«å ¬éããããã«æããŸãããäœãèµ·ãã£ãã®ãïŒ

ããã§ãã¹ããã1ãã3ãA1ã§å®è¡ãããŸããåºåã§ãBIããŒã ã¯ãèŠèŠåãéçºããããã«TableauServerã§å ¬éãããããŒã¿ãœãŒã¹ãåãåããŸããHyper APIãæ¥ç¶ãªã³ã¯ã«ãªããŸããããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
çµæ
ããŸããŸãªããŒã«ã§äœæ¥ãããšãã®ããŒãã®æ°ãæžãããŸãããããã§ãããã»ã¹ã®ã©ããã§ãã¹ãç¯ãããšãããé£ãããªãããšã©ãŒãçºçããå ŽæãèŠã€ãããããªããé害ã®èª¿æ»ã«ãããæéãççž®ãããŸããã·ã¹ãã ã¯ãäžè¬çãªãšã©ãŒã«ã€ããŠãŠãŒã¶ãŒã«èŠåããŸãã
BIããŒã ã®æéãè§£æŸããŸãã以åã¯ããã³ãã¬ãŒããœãªã¥ãŒã·ã§ã³ã¯ã»ãšãã©ãªããå€ãã®ã«ã¹ã¿ãã€ãºããããŸãããã»ãšãã©ã®å ŽåãPythonåŠçã¯ãããžã§ã¯ãããšã«è¿œå ãããŸããããŸãã«ãåŠçãäžèŠãªå Žåã¯ãTableau DesktopïŒã¡ã€ã³ã®éçºããŒã«ïŒã§çŽæ¥äœæ¥ããŸããã
ããã§ãããŒã¿ãœãŒã¹ã®æºåã¯æ¬¡ã®ããã«ãªããŸããA1ã€ã³ã¿ãŒãã§ã€ã¹ã§å¿ é ãã£ãŒã«ããã¯ãªãã¯ããïŒå¿ èŠã«å¿ããŠïŒè¡ã«å±éãããã£ãŒã«ããããŒã¯ãããªãã·ã§ã³ã§ãã£ãŒã«ãã®ã¿ã€ããäºåã«å®çŸ©ããŸãã
TableauServerãããŒãããŸããããã°ãããŒã¿ãœãŒã¹ã®æŽæ°-æŽæ°ã¯A1ã«ãã£ãŠè¡ãããæ¢è£œã®ãã€ããŒããµãŒããŒã«ããŠã³ããŒããããŸãã
*ããŒãã¹-ãŠãŒã¶ãŒã«ã¯A1å ã§äœæ¥ããããšããå§ãããŸãã以åã«äžéšã®ãŠãŒã¶ãŒãçã®ã¬ããŒããã¢ã³ããŒãããåŸãããŒã«ã®å€éšã§æåã§å€æŽããå Žåãã¹ããã1ãã3ãŸã§ã®ããã»ã¹å šäœãA1ã§è¡ãããããããŠãŒã¶ãŒã¯ããã§ã¯ãªãŒãã³ã°ããã»ã¹ãèšå®ããæ¹ãç°¡åã§ãã
åé¡ãšè§£æ±ºç
A1ã«ã€ããŠå°ã
ãœãªã¥ãŒã·ã§ã³ã«ã€ããŠèª¬æããåã«ãããŒã¿ãœãŒã¹ã®çæãã¢ã¿ããããå éšè£œåA1ã«ã€ããŠèª¬æããå¿ èŠããããŸãã
A1ã¯ç€Ÿå 補åã§ãããäž»ãªä»äºã次ã®åŸæ¥å¡ã®ã¯ãŒã¯ãããŒãç°¡çŽ åããããã«èšèšãããŠããŸãã
- MediaScopeãœãããŠã§ã¢è£œåããããŒã¿ãååŸãã
- ãã®ããŒã¿ã察象ã®ã¢ããªã¹ãã«ãšã£ãŠäŸ¿å©ãªåœ¢åŒã«ïŒã¯ãªãŒã³ã«ïŒæã¡èŸŒã¿ãŸã
- å¿ èŠã«å¿ããŠãããã·ã¥ããŒããäœæããããã®ããŒã¿ãæºåããŸãïŒããã«ã€ããŠã¯æ¬æ¥èª¬æããŸãïŒ
ãŠãŒã¶ãŒãããŒã¿ã®ã¯ãªãŒãã³ã°ãçµäºãããšãããŒã¿ã¯A1ã·ã¹ãã ã«ä¿åãããŸããç§ãã¡ã®çšèªã§ã¯ãããã¯ãã³ã³ããããšåŒã°ããŸããã³ã³ããã¯MongoDBã®éåžžã®ããã¥ã¡ã³ãã§ãããTableauãµãŒããŒã«è»¢éããå¿ èŠããããŸãã
BIããŒã ã®åé¡
ç§ãã¡ã®BIéçºããŒã ã¯ãMongoDBã«ä¿åãããŠããA1ããäœããã®æ¹æ³ã§ããŒã¿ãååŸããåä¿¡ããããŒã¿ã«åºã¥ããŠããã·ã¥ããŒããæ§ç¯ããå¿ èŠããããŸããããŸããéåžžã®ã¹ã³ã¢ããŒãããŒã«ã䜿çšããŠMongoDBããããŒã¿ããã§ããããããšããŸããããããã§ã¯åé¡ã¯è§£æ±ºããŸããã§ããã
- ããŒã¿ã¯MongoDBã«ä¿åããããããã¹ã³ã¢ããŒãã®å ¥ãå£ã§ä»»æã®æ§é ã®ããŒã¿ãåä¿¡ããŸããã€ãŸãããã®ããžãã¯ãåžžã«ç¶æããå¿ èŠããããŸãã
- MongoDBããããŒã¿ãéçŽããã«ã¯ãã³ã¬ã¯ã·ã§ã³å šäœã§ã¯ãªããã³ã¬ã¯ã·ã§ã³ããç¹å®ã®ã¬ã³ãŒãããã©ãã°ããå¿ èŠããããŸãããTableauãã©ã€ããŒã¯ãããå®è¡ã§ããŸããã
- ç¹ã«ãããŒã¿ãååŸããã ãã§ã¯äžååã§ãããäžéšã®åãè¡ã«ãããããè§£é€ãããããã«ãããŒã¿ããå±éãããå¿ èŠãããå ŽåããããŸãããããããäžèšã§èšãã°ãããã»ã©ç°¡åãªããšã§ã¯ãããŸããã§ããã
ç§ãã¡ã¯äœãæãã€ããã®ã§ãã
Tableau Hyper API ã©ã€ãã©ãªã䜿çšããŠãç§ã®ãã€ã¯ã§ãã®åé¡ã解決ããããšæ±ºå¿ããŸããããã®ã©ã€ãã©ãªã䜿çšãããšãããŒã¿ãç°¡åã«è¿œå ã§ãã.hyper圢åŒã®ãã¡ã€ã«ãäœæãããããããŒã¿ãœãŒã¹ãšããŠäœ¿çšããŠããµãŒããŒããŒãäžã«ããã·ã¥ããŒããäœæã§ããŸãã
ã¹ã³ã¢ããŒãã®éçºè ããã€ããŒèªäœã説æãããšã次ã®ããã«ãªããŸãã
Hyperã¯ãããŒã¿ããŒã¹ã¯ãšãªãå¹ççã«è©äŸ¡ããããšã«ãããå€§èŠæš¡ãŸãã¯è€éãªããŒã¿ã»ãããè¿ éã«åæããã®ã«åœ¹ç«ã€é«æ§èœã®ã¡ã¢ãªå ããŒã¿ãšã³ãžã³ã§ããTableauãã©ãããã©ãŒã ã«åºã¥ããŠãHyperã¯ç¬èªã®åçã³ãŒãçææè¡ãšé«åºŠãªåæå®è¡ãã¯ãããžãŒã䜿çšããŠãæœåºãšã¯ãšãªã§é«ãããã©ãŒãã³ã¹ãå®çŸããŸããç§ãã¡ã®ããã°ã©ã ã§ã®äœæ¥ã®ããããã®ããã»ã¹ã¯æ¬¡ã®ãšããã§ãã
- ãŠãŒã¶ãŒãã³ã³ãããšç®çã®åãéžæããŸã
- ã·ã¹ãã ã¯ã³ã³ããããããŒã¿ãåŒãåºããŸã
- åä¿¡ããããŒã¿ã«åºã¥ããŠãã·ã¹ãã ã¯åã®ã¿ã€ããå€å¥ããŸã
- ãã€ããŒã®äœæãšãã€ããŒãžã®ããŒã¿ã®æ¿å ¥ãåæåãããŸã
- ãã€ããŒã¯ã¹ã³ã¢ããŒããµãŒããŒã«ããŒããããŸã
- BIéçºè ã¯ãµãŒããŒäžã®ãã€ããŒã確èªããããã«åºã¥ããŠããã·ã¥ããŒããäœæããŸã
æ°ããããŒã¿ãã³ã³ããã«æ³šããããšããã€ããŒãæŽæ°ããå¿ èŠããããšããä¿¡å·ãã·ã¹ãã ã«éä¿¡ãããŸãã
- ã·ã¹ãã ã¯ã¹ã³ã¢ããŒããµãŒããŒãããã€ããŒãããŠã³ããŒãããŸã
- MongoDBããæ°ããããŒã¿ãååŸãããã€ããŒãæŽæ°ããŸã
- ãã®åŸãã·ã¹ãã ã¯æ°ãããã€ããŒããµãŒããŒã«ã¢ããããŒãããæ¢åã®ãã€ããŒãäžæžãããŸãã
- ãŠãŒã¶ãŒã¯ãæŽæ°ããã¿ã³ãã¯ãªãã¯ããã ãã§ãããã·ã¥ããŒãã«ææ°ã®æ å ±ã衚瀺ã§ããŸãã
ãŠãŒã¶ãŒã«è¡šç€ºããããã®
åè¿°ã®ããã«ãA1ã¯Webã¢ããªã±ãŒã·ã§ã³ã§ãã Vue.jsãšVuetifyã䜿çšããŠãããã³ããšã³ãã®ãã€ããŒçæãµãŒãã¹ãäœæããŸããã
ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¿ãŒãã§ã€ã¹ã¯3ã€ã®ç»é¢ã«åãããŠããŸãã
æåã®ç»é¢ã§ããŠãŒã¶ãŒã¯ç®çã®ã³ã³ãããŒãšåãéžæããŸãã
[ããããè§£é€]ãªãã·ã§ã³ãæå¹ã«ãªã£ãŠããå Žåããã€ããŒã«2ã€ã®è¿œå ã®åãäœæãããŸãïŒå€æ°-ã¡ããªãã¯åã«ãã£ãŠéžæãããåã®ååãšå€-ãããã®åããã®å€ã
ãã£ã¡ã³ã·ã§ã³åã¯ãåãååã®éžæãããåãæã€åããã€ããŒã«è¿œå ããŸããéžæããåã®æ°ãã£ã¡ã³ã·ã§ã³ãšãã®ååã¯ããã€ããŒå ã®ããŒãã«ã®æŽåæ§ã䟵害ãããªãããã«ããã¹ãŠã®ã³ã³ãããŒã§åãã§ããå¿ èŠããããŸãããããã£ãŠãã³ã³ãããŒå ã§ç°ãªãååãä»ããããŠããå Žåã«ãéžæããåã®ååãæå®ã§ããåããã€ããŒåãããããŸãã
ããã§ããã€ããŒãèšå®ããããã»ã¹ã¯çµäºã§ãããŠãŒã¶ãŒã¯2çªç®ã®ç»é¢ã«ç§»åãã[ãã€ããŒãäœæ]ãã¯ãªãã¯ããŠããã°ã§ã€ãã³ãã®é²è¡ç¶æ³ã確èªããã ãã§ãã
3çªç®ã®ç»é¢ã«ã¯ã远å ã®èšå®ãå«ãŸããŠããŸãã
- ãã€ããŒãèªåçã«æŽæ°ããã·ã¹ãã ãå¿ èŠãªãå Žåã¯ãæŽæ°ã®ç¡èŠããªã³ã«ããããšãã§ããŸã
- æŽæ°ã¬ããŒããéä¿¡ããã¡ãŒã«ãæå®ã§ããŸã
- å€åã®ããŒã¿ã¿ã€ããæåã§æå®ã§ããŸãïŒããããè§£é€ã¢ãŒãã§ã®ã¿äœ¿çšãããŸãïŒïŒfloatãstringããŸãã¯ã·ã¹ãã ã«ãã£ãŠèªåçã«æ±ºå®ãããŸãïŒã¿ã€ãã«ã€ããŠã¯ããã«èª¬æããŸãïŒ
- ã³ã³ããå ã®éžæããåã®ããŒã¿ã¿ã€ããæå®ããããšãã§ããŸãã
ãã³ãããã®äžã«ãããã®
A1ã¯Pythonã§æžãããŠããŸããããŒã¿ãåŠçããããã«ãPandasã䜿çšããPandasããã®ããŒã¿ãã·ãªã¢ã«åããŠãMongoDBGridFSã«ãã¯ã«ã¹ããŠä¿åããŸãã
ãã€ããŒãäœæããã³ãã³ããåä¿¡ãããšãã·ã¹ãã ã¯æ¬¡ã®æäœãå®è¡ããŸãã
- MongoDBããå¿ èŠãªãã¹ãŠã®ã³ã³ãããã¢ã³ããŒãããããŒã¿ãpandasdatafremesã«éã·ãªã¢ã«åããŸã
- ããŒã¿ãæºåããŸãïŒããŒã¿ãã¬ãŒã ã«å¿ èŠãªåã®ã¿ãæ®ããæ°ããååãä»ããå¿ èŠã«å¿ããŠpandas.meltãä»ããŠããŒãã«ãå±éããŸã
- ãŠãŒã¶ãŒãåã®ããŒã¿ã¿ã€ããèšå®ããå Žåã¯ãããŒã¿ãfloat32ãŸãã¯stringã«å€æããŸã
- ããŒã¿ã䜿çšãããã¹ãŠã®æºåäœæ¥ã®åŸãã·ã¹ãã ã¯ãã€ããŒapiãä»ããŠãã¡ã€ã«ãäœæããtabcmdãä»ããŠãã¡ã€ã«ãã¹ã³ã¢ããŒããµãŒããŒã«éä¿¡ããŸãã
åã®ããŒã¿ã¿ã€ãã«ã€ããŠå°ã説æãã䟡å€ããããŸããA1ã³ã³ããã«ããŒã¿ãä¿åããæ©èœã®1ã€ã¯ããŠãŒã¶ãŒãåã«å²ãåœãŠãã¿ã€ããæ°ã«ããããã³ããå®å šã«ãããè¡ãããšã§ãïŒã·ã¹ãã ã¯ãæ°å€ãšæååå€ãåã«ååšããç¶æ³ã«å·éã«å¯ŸåŠããŸãããã ãããã€ããŒã¯ããã奜ã¿ãŸãããåãintåã§ããå¿ èŠãããããšã圌ã«äŒãããšãã·ã¹ãã ã¯æŽæ°ä»¥å€ã®ãã®ãæ¿å ¥ããããšãããšèªããŸãããããã£ãŠããã€ããŒã§ã¯ãstringãšfloatã®2ã€ã®ããŒã¿ã¿ã€ãã®ã¿ã䜿çšããããšã«ããŸããã
ããã§ãç§ãã¡ã¯ä»äºã®äžè¬çãªååãçè§£ããŸããããã€ããŒèªäœã§åãããšã«ã€ããŠè©±ããŸãããã
.hyperãã¡ã€ã«ã®äœæ
Hyper APIã䜿çšããã«ã¯ãã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãããã¡ãã®å ¬åŒWebãµã€ãããããŠã³ããŒãã§ããŸãããã®ããŒã«ã®æäœæ¹æ³ã®è¯ãäŸãããã€ããããŸããäž»ãªãã€ã³ããç°¡åã«èª¬æããŸãã
hyiperãã¡ã€ã«èªäœã¯äžçš®ã®ããŒã¿ããŒã¹ã§ãããSQLiteããããã飿³ãããŸããapiãä»ããŠã次ã®ãããªSQLæ§æã䜿çšããŠããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸãã
f"SELECT {escape_name('Customer ID')} FROM {escape_name('Customer')}"
ã·ã¹ãã ã¯Pythonã§èšè¿°ãããŠããããã察å¿ããèšèªã®ã©ã€ãã©ãªã䜿çšããŸãããã¡ã€ã«ãäœæãããšãã¯ãã¹ããŒãåãããŒãã«åãããã³åãã¿ã€ãã§æå®ããå¿ èŠããããŸããTableau Serverãæ¬ã®ããŒã¿ãæœåºããããã«ç»ãã®ã¯ãã®ã¹ããŒãå ã®ããŒãã«ã§ãããããã¹ããŒããšããŒãã«ã®ååã¯ãExtractããšåŒã°ããå¿ èŠããããŸãã
with HyperProcess(Telemetry.SEND_USAGE_DATA_TO_TABLEAU) as hyper:
with Connection(
hyper.endpoint, self.fullpath_hyper, CreateMode.CREATE_AND_REPLACE
) as connection:
connection.catalog.create_schema("Extract")
main_table = TableName("Extract", "Extract")
example_table = TableDefinition(main_table)
ããŒãã«ãäœæããããåãäœæããŠã¿ã€ããèšå®ããå¿ èŠããããŸããåã«è¿°ã¹ãããã«ãããŒã¿ã«ã¯2ã€ã®ã¿ã€ãïŒãããŒããŸãã¯æååïŒãããªããããããŒã¿ãã¬ãŒã å ã®åã®ã¿ã€ãã«åºã¥ããŠããããåã«èšå®ããŸãã
for column in dataframe.columns:
if dataframe[column].dtype.name in ("category", "object"):
example_table.add_column(TableDefinition.Column(column, SqlType.text()))
elif dataframe[column].dtype.name in ("float32"):
example_table.add_column(
TableDefinition.Column(column, SqlType.double())
)
connection.catalog.create_table(example_table)
ããŒãã«ãäœæããåŸãããŒã¿ãæ¿å ¥ã§ããŸãã
with Inserter(connection, example_table) as inserter:
for val in dataframe.values:
inserter.add_row(val.tolist())
inserter.execute()
ããã§ã¯ãããŒã¿ãã¬ãŒã ã1è¡ãã€å®è¡ããinserter.add_row ïŒïŒãä»ããŠå€ãå«ããªã¹ãã环ç©ããŸããå®éãapiãã€ããŒã«ã¯é¢æ°add_rowsïŒïŒãããããªã¹ãã®ãªã¹ããååŸããŠããã§ã«å€ãæ¿å ¥ããŠããŸãããªããããè¡ãããªãã£ãã®ã§ããïŒ RAMãç¯çŽããã«ã¯ïŒããŒã¿ãã¬ãŒã ããå€ã®ãªã¹ãã®ãªã¹ããæäŸããã«ã¯ããã³ãã«values.tolistïŒïŒãå®è¡ããããã«äŸé Œããå¿ èŠããããŸãããŸãã1å5000äžè¡ã®ããŒã¿ãããå ŽåãRAMã®æäœã¯éåžžã«ã³ã¹ãããããããšãããããŸãããããã©ãŒãã³ã¹ã«ã¯ãŸã£ãã圱é¿ããŸããïŒãããã®å Žåããè¡ãç¹°ãè¿ãç¹°ãè¿ãããããã€ããŒã®äœæé床ãäœäžããããšã«æ°ã¥ããŸããã§ããïŒãããã«ãadd_rowsïŒïŒæ§æã·ã¥ã¬ãŒã®ããã«æ©èœããŸããå®éã«ã¯ãªã¹ãã®ãªã¹ããååŸããããŒã¿ãç¹°ãè¿ã远å ããŸãã
ããã§ãã€ããŒã®äœæã¯å®äºã§ããæ¬¡ã«ããµãŒããŒã«å ¬éããå¿ èŠããããŸãã
TableauãµãŒããŒãžã®ãã¡ã€ã«ã®å ¬é
tableau-serverã«ã¢ã¯ã»ã¹ããã«ã¯ãtabcmdãŠãŒãã£ãªãã£ã䜿çšããŸããããã¯ãµãŒããŒã«æ¥ç¶ããŠç®¡çæ©èœãå®è¡ã§ããã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ã§ãããŠãŒã¶ãŒãã°ã«ãŒããããã¯ãªã©ãäœæããŸãã
Pythonãµãããã»ã¹ãä»ããŠtabcmdã³ãã³ããå®è¡ããŸããPopenïŒ
popen = subprocess.Popen(
f'/opt/tableau/tabcmd/bin/tabcmd publish "{fullpath_hyper}" -n "{filename}" -o -r "A1_test" '
'-s http://tableau.domain.com -u "username" -p "password" --no-certcheck',
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
)
return_code = popen.wait()
if return_code:
error = str(popen.communicate()[1])
return f" . {error}"
次ã®ã³ãã³ããšããŒãtabcmdã«æž¡ããŸãã
- å ¬éïŒãã¡ã€ã«ããµãŒããŒã«ã¢ããããŒãããŸã
- -nïŒ-nameïŒïŒãµãŒããŒäžã«ãããã¡ã€ã«å
- -oïŒ-overwriteïŒïŒãã®ååã®ãã¡ã€ã«ãããå Žåã¯ãäžæžãããŸã
- -r âA1_testâ (--project): ( )
- -s (--server): tableau-
- -u -p:
- --no-certcheck: SSL-
æ°ãããã€ããŒãäœæããæ¹æ³ãçè§£ããŸãããããã€ããŒã10åã®ã³ã³ãããŒã§æ§æããããã®ãã¡ã®1ã€ãæ°ããããŒã¿ãåä¿¡ããå Žåã¯ã©ãããã°ããã§ããããããã€ããŒãæŽæ°ããŸãã
æ°ããããŒã¿ãã³ã³ããã«å°çãããšãã·ã¹ãã ã¯ãã®ã³ã³ããã䜿çšãããã€ããŒããããã©ããã確èªããŸããããå Žåãã¿ã¹ã¯ã¯ãã€ããŒãæŽæ°ããããšã§ãã
ã©ã®ã³ã³ããããã©ã®ããŒã¿ããã€ããŒã«ããããçè§£ããããã«ãã·ã¹ãã ã¯ãã€ããŒãäœæãããšãã«è¿œå ã®container_idåãäœæããŸãããã®ã¢ãããŒãã§ã¯ãæŽæ°ãéåžžã«ç°¡åã«ãªããŸãã
- ãµãŒããŒãããã¡ã€ã«ãååŸããŸã
- ãã€ããŒå ã®ãã¹ãŠã®è¡ãåé€ããŸããcontainer_idã¯æŽæ°ãããã³ã³ãããŒãšåãã§ãã
- æ°ããè¡ãæ¿å ¥ããŸã
- äžæžããã¡ã€ã«ããµãŒããŒã«ã¢ããããŒããçŽããŸãã
ãã¡ã€ã«ãååŸããããã»ã¹ã¯ããã¡ã€ã«ãããŠã³ããŒãããããã»ã¹ãšã¯å°ãç°ãªããŸãããŸãããµãŒããŒãã.hyperãã¡ã€ã«ãååŸããã®ã§ã¯ãªãã.tdsxã¢ãŒã«ã€ããååŸããŸãããããè§£åããŠã.hyperèªäœãéããŸãã
ãã¡ã€ã«ãååŸããã«ã¯ãtabcmdã䜿çšããŸãã
popen = subprocess.Popen(
f'/opt/tableau/tabcmd/bin/tabcmd get "datasources/{filename_tdsx}" '
f'-s http://tableau.domain.com -u "username" -p "password" '
f'--no-certcheck -f "{fullpath_tdsx}"',
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
)
return_code = popen.wait()
if return_code:
error = str(popen.communicate()[1])
return f". {error}"
ããã§ã¯ã次ã®ã³ãã³ããšããŒã䜿çšããŸãã
- getïŒãµãŒããŒãããã¡ã€ã«ãååŸããŸããtest.hyperãã¡ã€ã«ããµãŒããŒäžã«ããå Žåã¯ãtest.tdsxãã¡ã€ã«ãåç §ããå¿ èŠãããããããã¯ãã¹ãŠããŒã¿ãœãŒã¹ãã£ã¬ã¯ããªã«ãããŸãïŒã¹ã³ã¢ããŒãã®ãã®ãããªæ©èœãã³ã¡ã³ãã§å ±æãããŠããçç±ãã°ãŒã°ã«ã§ããŸããã§ããïŒ
- -fïŒ-filenameïŒïŒãã¡ã€ã«åãšæ¡åŒµåãå«ããã«ãã¹ããã¡ã€ã«ã®ä¿åå Žæ
ãã¡ã€ã«ãããŠã³ããŒããããããzipãã¡ã€ã«ãä»ããŠè§£åããå¿ èŠããããŸãã
with zipfile.ZipFile(fullpath_tdsx, "r") as zip_ref:
zip_ref.extractall(path)
è§£ååŸããã€ããŒã¯./Data/Extractsãã£ã¬ã¯ããªã«ãããŸãã
ãã¡ã€ã«ã®çŸåšã®ããŒãžã§ã³ãã§ããã®ã§ãäžèŠãªè¡ããã¡ã€ã«ããåé€ã§ããŸãã
table_name = TableName("Extract", "Extract")
with HyperProcess(Telemetry.SEND_USAGE_DATA_TO_TABLEAU) as hyper:
with Connection(hyper.endpoint, self.fullpath_hyper) as connection:
connection.execute_query(
f"DELETE FROM {table_name} WHERE "
f'{escape_name("container_id")}={container_id}'
).close()
ããŠããã¡ã€ã«ã®æ¿å ¥ãšå ¬éã¯ãã§ã«äžã§èª¬æãããŠããŸãã
çµè«
åçã¯äœã§ããïŒãã€ããŒãã¡ã€ã«ã®çæãštableau-serverãžã®èªåé ä¿¡ã®å®è£ ã«é¢ããäœæ¥ãè¡ã£ãåŸãBIããŒã ã®è² è·ãå€§å¹ ã«è»œæžããããã·ã¥ããŒãã®ããŒã¿ã®æŽæ°ã容æã«ãªããæãéèŠãªããšãšããŠãããé«éã«ãªããŸããããã€ããŒAPIã«ç²ŸéããŠããããšã¯èŠçã§ã¯ãªããããã¥ã¡ã³ãã¯é©åã«èšè¿°ãããŠããããã¯ãããžãŒãã·ã¹ãã ã«çµ±åããããšã¯ç°¡åã§ããã
ãæž èŽããããšãããããŸããïŒã質åããæèŠãããããŸããããã³ã¡ã³ãæ¬ã«ãèšå ¥ãã ããã
ãã®èšäºã¯VasilyLavrovïŒVasilyFromOpenSpace) â -