G-gen ã®äœã
æšã§ããåœèšäºã§ã¯ãBigQuery ã® å€éšããŒã¿ã»ãã ãšã㊠Spanner ããŒã¿ããŒã¹å
ã®ããŒãã«ãåç
§ããæ¹æ³ã解説ããŸãã åæç¥è BigQuery Spanner BigQuery ãš Spanner ã®é£æº 2ã€ã®é£æºæ¹æ³ 飿ºã¯ãšãªãšã¯ å€éšããŒã¿ã»ãããšã¯ 飿ºã¯ãšãªãšå€éšããŒã¿ã»ããã®æ¯èŒ å¶éäºé
BigQuery ãã Spanner ãžã®ãªããŒã¹ ETL æé Spanner ã®æºå ã€ã³ã¹ã¿ã³ã¹ãããŒã¿ããŒã¹ã®äœæ ããŒãã«ã®äœæ ããŒã¿ã®æ¿å
¥ å€éšããŒã¿ã»ããã®äœæ å€éšããŒã¿ã»ããã«å¯Ÿããã¯ãšãªå®è¡ åæç¥è BigQuery BigQuery 㯠Google Cloud ã«ããã代衚çãªãµãŒãã¹ã®1ã€ã§ãããé«ããã©ãŒãã³ã¹ãã€èªåã§ã¹ã±ãŒã«ãããã«ãããŒãžãã®åæçšããŒã¿ããŒã¹ïŒããŒã¿ãŠã§ã¢ããŠã¹ïŒãåŸé課éã§å©çšããããšãã§ããŸãã åèïŒ BigQuery BigQuery ã®è©³çްã«ã€ããŠã¯ã以äžã®èšäºãåç
§ããŠãã ããã blog.g-gen.co.jp blog.g-gen.co.jp Spanner Spanner ã¯ãGoogle Cloud ã®ãã«ãããŒãžã RDBïŒãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ïŒãµãŒãã¹ã§ãã匷æŽåæ§ãä¿èšŒãã RDB ã®ç¹åŸŽãšãã°ããŒãã«ã«æ°Žå¹³ã¹ã±ãŒãªã³ã°ã§ãã NoSQL ããŒã¿ããŒã¹ã®ç¹åŸŽã䜵ãæã€ã匷åãªåæ£ããŒã¿ããŒã¹ãå©çšããããšãã§ããŸãã åèïŒ Spanner Spanner ã®è©³çްã«ã€ããŠã¯ã以äžã®èšäºãåç
§ããŠãã ããã blog.g-gen.co.jp BigQuery ãš Spanner ã®é£æº 2ã€ã®é£æºæ¹æ³ BigQuery ãã Spanner ããŒã¿ããŒã¹å
ã®ããŒã¿ã«ã¢ã¯ã»ã¹ããã«ã¯ã以äžã®2éãã®æ¹æ³ã䜿çšã§ããŸãããããã®æ¹æ³ã§ããSpanner ãã BigQuery ã«ããŒã¿ãç§»åããããšãªããSpanner äžã®ããŒãã«ã«å¯Ÿãã èªã¿åãå°çš ã®ã¢ã¯ã»ã¹ãæäŸãããŸãã 飿ºã¯ãšãª ïŒFederated queryïŒ å€éšããŒã¿ã»ãã ïŒExternal dataset ãŸã㯠Federated datasetïŒ é£æºã¯ãšãªãšã¯ BigQuery ã® é£æºã¯ãšãª ãšã¯ã EXTERNAL_QUERY 颿°ãçšããŠãSpanner ã Cloud SQL ãªã©ã®å€éšããŒãã«ã« SQL ãå®è¡ã§ããæ©èœã§ããSpannerãCloud SQLãAlloyDB for PostgreSQLãSAP DatasphereïŒãã¬ãã¥ãŒïŒã«å¯Ÿå¿ããŠããŸãã 飿ºã¯ãšãª ã䜿ãã«ã¯ããŸã BigQuery ã§ æ¥ç¶ ïŒconnectionsïŒãšãããªãœãŒã¹ãäœæããSpanner ãªã©ã®å€éšããŒã¿ããŒã¹ã«å¯Ÿããæ¥ç¶èšå®ãè¡ããŸããã¯ãšãªããéã¯ã EXTERNAL_QUERY 颿°ã䜿çšããŠãããŒãã«ãæå®ããã¯ãšãªãå®è¡ããŸãã 飿ºã¯ãšãªã§ã¯ãBigQuery ã® GUI ã§ãã BigQuery Studio ãã Spanner çã®å€éšããŒã¿ããŒã¹ã®ããŒãã«äžèЧãã¹ããŒãæ
å ±ã¯é²èЧã§ããŸããã åè : 飿ºã¯ãšãªã®æŠèŠ åè : Spanner federated queries å€éšããŒã¿ã»ãããšã¯ åœèšäºã§ç޹ä»ãã BigQuery ã® å€éšããŒã¿ã»ãã ãšã¯ãSpanner ã®ããŒã¿ããŒã¹å
šäœã BigQuery ãšé£æºããããŒãã«äžèЧãã¹ããŒãæ
å ±ã®é²èЧãå¯èœã«ããã»ããBigQuery ãã Spanner ãžã®èªã¿åãã¯ãšãªãå¯èœã«ããæ©èœã§ãã å€éšããŒã¿ã»ãããèšå®ããã«ã¯ããŸã CREATE EXTERNAL SCHEMA ã§ã¹ããŒãã¡ã³ãã§ BigQuery ã«å€éšããŒã¿ã»ãããäœæããŸããå€éšããŒã¿ã»ããã¯éåžžã® BigQuery ããŒã¿ã»ããåæ§ã«ãBigQuery Studio ããçŽæ¥ããŒãã«ãã¹ããŒãã確èªããããšãã§ããã¯ãšãªãå®è¡ããé㯠FROM å¥ã§çŽæ¥æå®ããããšãã§ããŸãã å€éšããŒã¿ã»ãã㯠BigQuery Studio äžã§ã¹ããŒãã確èªã§ãã åèïŒ Create Spanner external datasets Spanner äžã®ããŒã¿ã«å¯Ÿããã¯ãšãªã¯ Spanner Data Boost ã䜿çšããŠå®è¡ãããŸãïŒé£æºã¯ãšãªã®å Žåã¯ä»»æã§äœ¿çšïŒãããã«ãããSpanner ã€ã³ã¹ã¿ã³ã¹ã®ã³ã³ãã¥ãŒããªãœãŒã¹ã䜿çšããããšãªããã€ãŸã Spanner ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããããšãªã BigQuery ã«ããŒã¿ã飿ºããããšãã§ããŸãã åè : Data Boost ã®æŠèР飿ºã¯ãšãªãšå€éšããŒã¿ã»ããã®æ¯èŒ 飿ºã¯ãšãªãšå€éšããŒã¿ã»ããã®éããç°¡åã«ãŸãšãããšä»¥äžã®ãšããã§ãã 飿ºã¯ãšãª å€éšããŒã¿ã»ãã å©ç𿹿³ BigQuery ã§ æ¥ç¶ ãäœæã EXTERNAL_QUERY 颿°ã§ Spanner ããŒã¿ããŒã¹å
ã®ããŒãã«ãæå®ããŠã¯ãšãªãå®è¡ BigQueryã§ å€éšããŒã¿ã»ãã ãäœæã FROM å¥ã§å€éšããŒã¿ã»ããå
ã®ããŒãã«ãæå®ããŠã¯ãšãªãå®è¡ å¿
èŠãª IAM ããŒã« ã»Cloud Spanner ããŒã¿ããŒã¹èªã¿åãïŒroles/spanner.databaseReaderïŒ ã»BigQuery æ¥ç¶ãŠãŒã¶ãŒïŒroles/bigquery.connectionUserïŒ ã»Cloud Spanner Database èªã¿åããš DataBoostïŒroles/spanner.databaseReaderWithDataBoostïŒ äœ¿çšã§ãã SQL ã»Google æšæº SQL ã»PostgreSQL äºæ â»ã¬ã¬ã·ãŒ SQL ã¯äœ¿çšäžå¯ ã»Google æšæº SQL ã»ã¬ã¬ã·ãŒ SQL Spanner Data Boost ä»»æã§æå¹å åžžã«äœ¿çšããã GUI ã§ã¹ããŒãç¢ºèª ÃïŒinformation_schema ãã¥ãŒã§ç¢ºèªå¯èœïŒ â æé ã»BigQuery ã®ã¯ãšãªæéïŒãªã³ããã³ãã®å Žåã» åè ïŒ ã»Spanner Data Boost ã®æéïŒæå¹åããå Žåã» åè ïŒ ã»BigQuery ã®ã¯ãšãªæéïŒãªã³ããã³ãã®å ŽåïŒ ã»Spanner Data Boost ã®æé å€éšããŒã¿ã»ããã¯æ¥ç¶ãªãœãŒã¹ãäœæããªããããèšå®æ¹æ³ãã¯ãšãªãã·ã³ãã«ã§ããBigQuery ãš Spanner ã®é£æºãæ€èšããå ŽåããŸãã¯å€éšããŒã¿ã»ããã®å©çšãæ€èšããå¶éäºé
ãåé¡ãšãªãå Žåã«é£æºã¯ãšãªãå©çšãããšããã§ãããã å¶éäºé
飿ºã¯ãšãªã«ã¯ä»¥äžã®ãããªå¶éäºé
ããããŸãã ã¯ãšãªã¯èªã¿åãå°çšãDMLãDDL ã¹ããŒãã¡ã³ãã¯ãµããŒããããªã BigQuery ã§ãµããŒããããŠããªãããŒã¿åã®åãå«ãã¯ãšãªã¯å€±æããïŒãµããŒããããŠããããŒã¿åãžã®ãã£ã¹ãã¯å¯èœïŒ 顧客管çã®æå·éµïŒCMEKïŒã䜿çšããå ŽåãBigQuery ãš Spanner ã®ããããã«èšå®ããå¿
èŠããã å€éšããŒã¿ã»ããã§ã¯äžèšã«å ããŠãããã«ä»¥äžã®å¶éã远å ãããŸãã BigQuery ã§ãµããŒããããŠããªãããŒã¿åã®åã«ã¯ã¢ã¯ã»ã¹ã§ããªã ååä»ãã¹ããŒãã䜿çšãã Spanner ã®ããŒãã«ã«ã¯ã¢ã¯ã»ã¹ã§ããªã è¡ã¬ãã«ã®ã»ãã¥ãªãã£ãåã¬ãã«ã®ã»ãã¥ãªãã£ãããŒã¿ ãã¹ãã³ã°ã¯äœ¿çšã§ããªã Spanner å€éšããŒã¿ã»ããã®ããŒãã«ã«åºã¥ããããªã¢ã©ã€ãºããã¥ãŒã¯äœ¿çšã§ããªã 詳现ã¯ã以äžã®å
¬åŒããã¥ã¡ã³ããåç
§ããŠãã ããã åè : 飿ºã¯ãšãªã®æŠèŠ - å¶éäºé
åè : Spanner å€éšããŒã¿ã»ãããäœæãã - å¶éäºé
BigQuery ãã Spanner ãžã®ãªããŒã¹ ETL å€éšããŒã¿ã»ããã䜿ãããšã§ãBigQuery ãã Spanner ã®ããŒã¿ãååŸããã ãã§ã¯ãªããBigQuery äžã®ããŒãã«ã Spanner ããŒã¿ããŒã¹ã«ãšã¯ã¹ããŒãããããšãã§ããŸãã ããã«ãããSpanner å€éšããŒã¿ã»ããããããŒã¿ãæœåºã㊠BigQuery äžã§å€§èŠæš¡ãªå€æåŠçãè¡ãã倿åŸã®ããŒã¿ã Spanner ã«æžãæ»ããŠã¢ããªã±ãŒã·ã§ã³ããå©çšãã ãªããŒã¹ ETL ãå®çŸããããšãã§ããŸãã 以äžã®ããã« EXPORT DATA OPTIONS ã¹ããŒãã¡ã³ãã䜿çšããããšã§ãBigQuery ãã Spanner ãžã®ãšã¯ã¹ããŒããè¡ãããšãã§ããŸãã /* BigQuery ãã Spanner ãžã®ãªããŒã¹ ETL */ EXPORT DATA OPTIONS ( uri= " https://spanner.googleapis.com/projects/<ãããžã§ã¯ãID>/instances/<Spannerã€ã³ã¹ã¿ã³ã¹å>/databases/<SpannerããŒã¿ããŒã¹å> " , format= ' CLOUD_SPANNER ' , spanner_options= """ { "table" : " <Spanneräžã®å®å
ããŒãã«> " } """ ) AS SELECT * FROM `<BigQueryäžã®ãœãŒã¹ããŒãã«>`; ãã®æ©èœã¯ BigQuery Enterprise ãšãã£ã·ã§ã³ ããã㯠Enterprise Plus ãšãã£ã·ã§ã³ ã§ã®ã¿å©çšå¯èœã§ãã åèïŒ Export data to Spanner (reverse ETL) æé Spanner ã®æºå ã€ã³ã¹ã¿ã³ã¹ãããŒã¿ããŒã¹ã®äœæ ãŸããSpanner ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸããåœèšäºã§ã¯æ±äº¬ãªãŒãžã§ã³ã䜿çšããæå°ã®ã³ã³ãã¥ãŒããªãœãŒã¹ã§ãã100åŠçãŠãããã§ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã # Spanner ã€ã³ã¹ã¿ã³ã¹ãäœæãã $ gcloud spanner instances create < ã€ã³ã¹ã¿ã³ã¹å > \ --config = regional-asia-northeast1 \ --description =" Test Instance " \ --processing-units = 100 äœæããã€ã³ã¹ã¿ã³ã¹ãæå®ããŠããŒã¿ããŒã¹ãäœæããŸãã ããŒã¿ããŒã¹ã BigQuery ã®å€éšããŒã¿ã»ãããšããŠå©çšããå ŽåãèšèªïŒdialectïŒã¯ Google æšæº SQL ã«ããå¿
èŠããããŸãã # Spanner ã€ã³ã¹ã¿ã³ã¹å
ã«ããŒã¿ããŒã¹ãäœæãã $ gcloud spanner databases create < ããŒã¿ããŒã¹å > \ --instance =< ã€ã³ã¹ã¿ã³ã¹å > \ --database-dialect = GOOGLE_STANDARD_SQL ããŒãã«ã®äœæ ãããã㯠Google Cloud ã³ã³ãœãŒã«ã䜿çšããŠãäœæããããŒã¿ããŒã¹ã® Spanner Studio ããæäœãè¡ããŸãã 以äžã®ã¯ãšãªãå®è¡ããSpanner ããŒã¿ããŒã¹ã«ããŒãã«ãäœæããŸãã /* ããŒãã«ã2ã€äœæãã */ CREATE TABLE Singers ( SingerId INT64 NOT NULL , FirstName STRING( 1024 ), LastName STRING( 1024 ), SingerInfo BYTES( MAX ) ) PRIMARY KEY (SingerId); CREATE TABLE Albums ( SingerId INT64 NOT NULL , AlbumId INT64 NOT NULL , AlbumTitle STRING( MAX ) ) PRIMARY KEY (SingerId, AlbumId), INTERLEAVE IN PARENT Singers ON DELETE CASCADE; Spanner Studio ã§ã¯ãšãªãå®è¡ãã ããŒã¿ã®æ¿å
¥ äœæããåããŒãã«ã«ããŒã¿ãæ¿å
¥ããŸãã /* åããŒãã«ã«ããŒã¿ãæ¿å
¥ãã */ INSERT INTO Singers (SingerId, FirstName, LastName) VALUES ( 1 , ' Marc ' , ' Richards ' ), ( 2 , ' Catalina ' , ' Smith ' ), ( 3 , ' Alice ' , ' Trentor ' ), ( 4 , ' Lea ' , ' Martin ' ), ( 5 , ' David ' , ' Lomond ' ); INSERT INTO Albums (SingerId, AlbumId, AlbumTitle) VALUES ( 1 , 1 , ' Total Junk ' ), ( 1 , 2 , ' Go, Go, Go ' ), ( 2 , 1 , ' Green ' ), ( 2 , 2 , ' Forever Hold Your Peace ' ), ( 2 , 3 , ' Terrified ' ); å€éšããŒã¿ã»ããã®äœæ ãããã㯠BigQuery Studio ã§äœæ¥ã宿œããŸãã CREATE EXTERNAL SCHEMA ã¹ããŒãã¡ã³ãã䜿çšããããšã§ãBigQuery ã®å€éšããŒã¿ã»ãããäœæããããšãã§ããŸãã OPTIONS ã§åç
§å
ãšãªã Spanner ããŒã¿ããŒã¹ãæå®ããŸãã /* BigQuery ã§ Spanner å€éšããŒã¿ã»ãããäœæãã */ CREATE EXTERNAL SCHEMA `<ãããžã§ã¯ãID>.<äœæããå€éšããŒã¿ã»ããã®åå>` OPTIONS ( external_source = ' google-cloudspanner:/projects/<ãããžã§ã¯ãID>/instances/<Spannerã€ã³ã¹ã¿ã³ã¹å>/databases/SpannerããŒã¿ããŒã¹å ' , location = ' asia-northeast1 ' ); äžèšã®ã¯ãšãªãå®è¡ãããšãSpanner ããŒã¿ããŒã¹ã«ååšãã2ã€ã®ããŒãã«ãå«ã Spanner å€éšããŒã¿ã»ãããäœæãããŸãã Spanner ããŒã¿ããŒã¹ããœãŒã¹ãšããå€éšããŒã¿ã»ãã å€éšããŒã¿ã»ããã«å¯Ÿããã¯ãšãªå®è¡ å€éšããŒã¿ã»ããã«å¯Ÿããã¯ãšãªãå®è¡ããã«ã¯ãéåžžã® BigQuery ããŒã¿ã»ããã«å¯Ÿããã¯ãšãªãšåæ§ã«ãFROM å¥ã§ããŒã¿ã»ãããšããŒãã«ãæå®ããŸãã 以äžã®ã¯ãšãªã§ã¯ãSpanner ããŒã¿ããŒã¹å
ã®2ã€ã®ããŒãã«ãçµåãã SELECT ã¯ãšãªãå®è¡ããŸãã /* Spanner å€éšããŒã¿ã»ããå
ã®ããŒãã«ã«ã¯ãšãªãå®è¡ãã */ SELECT s.FirstName, s.LastName, a.AlbumTitle FROM `<ãããžã§ã¯ãID>.<å€éšããŒã¿ã»ããã®åå>.Singers` AS s JOIN `<ãããžã§ã¯ãID>.<å€éšããŒã¿ã»ããã®åå>.Albums` AS a ON s.SingerId = a.SingerId; å€éšããŒã¿ã»ããã«å¯ŸããŠã¯ãšãªãå®è¡ãã äœã
æš é§¿å€ª (èšäºäžèЧ) G-genæå端ãåæµ·éåšäœã®ã¯ã©ãŠããœãªã¥ãŒã·ã§ã³éšãšã³ãžã㢠2022幎6æã«G-genã«ãžã§ã€ã³ãGoogle Cloud Partner Top Engineer 2025 Fellowã«éžåºã奜ããªGoogle Cloudãããã¯ãã¯Cloud Runã è¶£å³ã¯ã³ãŒããŒãå°èª¬ïŒSFããã¹ããªïŒãã«ã©ãªã±ãªã©ã Follow @sasashun0805