рд╣рдо BigQuery рдирд╛рдо рдХреИрд╕реЗ рдХреА рдХрд╣рд╛рдиреА

рдХрд╛рд░реНрдп


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдЬрд┐рд╕ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╡рд╣ рдЗрд╕рдХреЗ рд╢рдмреНрджрд╛рдВрдХрди рдореЗрдВ рдЙрджрд╛рд╕реА рд╕реЗ рд╕рд░рд▓ рд╣реИ: рдИ-рдХреЙрдорд░реНрд╕ рд╡рд┐рднрд╛рдЧ рдХреЗ рдмрд┐рдХреНрд░реА рдбреЗрдЯрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рд░рдХреНрдд рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЕрд░реНрдерд╛рддреН, рдкрдврд╝реЗрдВ, рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХреЗ рд▓рд┐рдПред


рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рд╣рдорд╛рд░реЗ рд╕реНрдЯреЛрд░реЛрдВ рдХреА рдЯреЛрдХрд░рд┐рдпрд╛рдБ рджреБрдирд┐рдпрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдСрдирд▓рд╛рдЗрди рдмрд┐рдХреНрд░реА рдкрд░ рдбреЗрдЯрд╛ рдХреА рдПрдХ рдирд┐рд░рдВрддрд░ рдзрд╛рд░рд╛ рдмрдирд╛рддреА рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд╕рднреА рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЗ рд╣реИрдВ: рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореБрджреНрд░рд╛рдПрдБ, рд╕рдордп рдХреНрд╖реЗрддреНрд░, рдХрд░, рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░, рдСрд░реНрдбрд░ рдЖрджрд┐ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╣реА рдХрд┐рд╕реА рднреА рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдХреЗрд╡рд▓, рд╢рд╛рдпрдж, рдСрд░реНрдбрд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИрдВред


рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдкрд░ рдмреИрдареЗ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдПрдЧреНрд░реАрдЧреЗрдЯ рдбреИрд╢рдмреЛрд░реНрдб рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬрд┐рд╕ рдкрд░ рд╡реНрдпрд╡рд╕рд╛рдп рд╡рд░реНрддрдорд╛рди рдХреНрд╖рдг рдХреЗ рдСрдирд▓рд╛рдЗрди рдкреНрд░рдореБрдЦ рд╕рдВрдХреЗрддрдХ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдСрдирд▓рд╛рдЗрди (рдпрд╛ рдмрд▓реНрдХрд┐, рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ) рджреЗрдЦ рд╕рдХреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ рдпреЗ рдбреИрд╢рдмреЛрд░реНрдб рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рдЧреНрд░реА рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рдереЗред


рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ


рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдордиреЗ рдПрдХ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рд╣рдордиреЗ рдРрд╕реЗ рдбреЗрдЯрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рджреЗрдЦрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Owox, Microsoft рд╕реЗ BI рд╕рдорд╛рдзрд╛рди, рдХреБрдЫ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝ рд╕рдорд╛рдзрд╛рди, рдЖрджрд┐ред
рдпрд╣ рд╕рдм рд╡рд┐рдЬреНрдЮрд╛рдкрди рджреНрд╡рд╛рд░рд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдкрд░рдВрддреБ:


  • рд╕рд╕реНрддрд╛ рдирд╣реАрдВ
  • рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЪреАрдЬрд╝ (рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рд╕рд┐рд░реНрдл рд╡рд┐рдХрд╛рд╕ рдХрдВрдкрдиреА рдХреЗ рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рдХреА рджрдХреНрд╖рддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд░рд╣рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ)

рдЙрд╕ рд╕рдордп (2019) рддрдХ, рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Google Datastudio рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рдкреЙрдХреЗрдЯ рдбреЗрдЯрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рдХреНрд╖реЗрдкрдг рдерд╛, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡рд░реНрд╖ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рдерд╛ рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдореИрдВрдиреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ 1 рд╕реА рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ рдЕрдкрд▓реЛрдб рдХреА рд╣реИ, рдЗрд╕реЗ Google рд╕рдВрдЧреНрд░рд╣рдг рдХреНрд▓рд╛рдЙрдб рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ (рднреНрд░рдорд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ) GoogleDrive), рд╡рд╣рд╛рдВ рд╕реЗ - BigQuery рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ, рдФрд░ рдлрд┐рд░, DataStudio рдореЗрдВ, рдореИрдВрдиреЗ рдбреЗрдЯрд╛ рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ред


тАФ , , , , .


, , , , . Data Studio , BigQuery , , , , .


, , SQL BigQuery, , .


BigQuery (https://console.cloud.google.com/bigquery), , .


, : 300 . , 2 BigQuery, , .



. , , BigQuery , , . , !


, SELECT, , BQ.


, BQ , . , , , .


: SQL ==> Python ==> BigQuery.


, тАФ .


, SELECT csv- GoogleStorage BQ , Google Functions, Python ( ) . , 6 ( ) .


, ?



, , , SQL . , Orders, , , , , , , id, id .. , , .


, , SELECT pandas dataframe. :


import pandas as pd
import MySQLdb
import MySQLdb.cursors

def sql_query(date0, date1):
    connection = MySQLdb.connect(host=тАЭserverтАЭ, user=тАЭuserтАЭ, passwd=тАЭpassтАЭ, db=тАЭordersтАЭ, charset=тАЭcp1251тАЭ, cursorclass = MySQLdb.cursors.SSCursor)
    query = тАЬSELECT * FROM orders WHERE date>=тАЩтАЭ+date0+тАЭтАЩ and date<тАЩтАЭ+date1+тАЭтАЩ тАЭ
    data =  pd.read_sql_query(query, connection=connection)
#  query -   SELECT   ,     date0  date1,   , ,   5 .          -       .          ,      BQ
# , ,  connection      ,        ..       .

#     -  . ,        :

    data.payment_date = data.payment_date.apply(lambda x: x.tz_localize(тАШEurope/MoscowтАЩ)).astype(str)

#     str -  .  ,      ,       .     BQ         .

# ,     pandas     BQ,           ,      .

    return data

, 5- , (90 , .. ) , sql_query(date) , BQ.


, , pandas dataframe .



: , BQ MERGE . BQ 1-2 . 20 70 , STRING FLOAT. 70000 .


, . BQ, .


from google.cloud import bigquery
from google.oauth2 import service_account

project_id = тАЬMyBQprojectтАЭ  #    BQ
dataset_id = тАЬMyDataSetтАЭ  #     

#       BQ.       - ( ,    ).       BQ.  ,   ,    тАШService accountsтАЩ  Google Cloud Platform.

credentials = service_account.Credentials.from_service_account_file(тАЬacc.jsonтАЭ)
client = bigquery.Client(project_id, credentials=credentials)

def upload_temp_table(df, table_id, schema):
    job_config = bigquery.LoadJobConfig()
    job_config.schema = schema
   # job_config.autodetect = True  #     
    job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE  #  
    job = client.load_table_from_dataframe(df, table_id, job_config=job_config)
    job.result()   #  

def merge_tables(temp_table, base_table, schema, head, merge_param):
    merge_query = тАЬMERGE into тАЬ+base_table+тАЭ as T USING тАЬ+temp_table+тАЭ as S \
         ON T.тАЭ+merge_param+тАЭ = S.тАЭ+merge_param+ \
         тАЬ WHEN MATCHED then UPDATE SET тАЬ+ \
         тАШ,тАЩ.join([тАШT.тАЩ+item+тАЩ=S.тАЩ+item for item in head])+ \
         тАЬ WHEN NOT MATCHED then INSERT \
         (тАЬ+тАЩ,тАЩ.join(head)+тАЭ) VALUES (тАЬ+тАЩ,тАЩ.join([тАШS.тАЩ+item for item in head])+тАЭ);тАЭ

#  ,         merge_param (,  id ,        )

#  -  

    job_config = bigquery.LoadJobConfig()
    job_config.schema = schema
    job = client.query(merge_query, job_config=job_config)
    job.result()

, тАФ .


import datetime

for period in range(18):
    date0 = (datetime.datetime.now() - datetime.timedelta(days = period*5 + 5)).strftime(тАШ%Y%m%dтАЩ)
    date1 = (datetime.datetime.now() - datetime.timedelta(days = period*5)).strftime(тАШ%Y%m%dтАЩ)
    df = sql_query(date0,date1)   #    sql   >=date0, <date1
    upload_temp_table(df=df, table_id=тАЭtemp_tableтАЭ, schema)  #    
    merge_tables(temp_table=тАЩtemp_tableтАЩ, base_table = тАШordersтАЩ, schema=schema, head=[,,,], merge_param=тАЩidтАЩ)

head тАФ . . SQL , . MERGE- . BQ . - , Python , BQ.



.


import sys

log_file = open(тАЬlog.txtтАЭ, тАШaтАЩ)
old_stdout = sys.stdout
sys.stdout = log_file

, print
:


sys.stdout = old_stdout
log_file.close()

print -. , .



, BigQuery , DataStudio (https://datastudio.google.com/) .


, DataStudio , BigQuery Python. , , , apply.


, DataStudio (, ), , , , Datastudio .


, Datastudio Blended Tables, LEFT JOIN - . , , , BigQuery. , , , SQL-, BigQuery . , , 6 , , 6 . 20 70 3-4 BigQuery. .


, . , . - BigQuery, - Python. , merge_tables тАФ BQ . , .. тАФ . , .


, BigQuery , Google Spreadsheets. - id . :


  • Python pandas dataframe
  • BQ JOIN BQ (-, ).

, . - , , , .


. - -, . , , ( , F5). : Data Studio Auto-Refresh. : , View, Data Studio Auto-Refresh, , SQL=>BQ.


, , , :-)


All Articles