前提・実現したいこと
Google Cloud FunctionsからGCSへredashのクエリ抽出結果(redash_dynamic_queryを使用)をアップロードしたいのですが、上手く行きません。
最終的には、Google Cloud Functions(トリガー:pub/sub)でredashクエリ結果を抽出するのを、Cloud Schedulerで定期実行させたい形です。
アップロードの際に他に何か必要な事があるのか(設定で書き込み不可になっているなど)、それともそもそもコードがおかしいのか調べても情報がうまく得られず、悩んでおります。ご助言頂けないでしょうか。
該当のソースコード
main
1from redash_dynamic_query import RedashDynamicQuery 2import pandas as pd 3import json 4from google.cloud import storage as gcs 5 6def upload_blob(bucket_name, destination_blob_name, flg_index=False, flg_header=True): 7 redash = RedashDynamicQuery( 8 endpoint='https://redash.xxx.com/', 9 apikey='[api_key]', 10 max_wait=5000, 11 ) 12 query_id = 1200 13 bind = { 14 "start_date": '2021-06-01T00:00:00', 15 "end_date": '2021-06-07T23:59:59', 16 } 17 18 #redashのクエリ結果を取得 19 result = redash.query(query_id, bind) 20 res = result['query_result']['data'] 21 22 #jsonを整形 23 res_format_json = json.dumps(res, indent=4, separators=(',', ': ')) 24 25 #json形式でエラーが出るため、一時tmpへ退避 26 f = open('/tmp/'+'output.json', 'w') 27 t = 'output.json' 28 shutil.copy2(user_secret_file, f) 29 json.dump(res['rows'], t) 30 31 #変換したいjsonファイルを読込 32 df = pd.read_json("output.json") 33 """Uploads a file to the bucket.""" 34 # The ID of your GCS bucket 35 bucket_name = "[bucket_name]" 36 # The ID of your GCS object 37 destination_blob_name = "testQuery_2021_05_11.csv" 38 39 storage_client = storage.Client() 40 bucket = storage_client.bucket(bucket_name) 41 blob = bucket.blob(destination_blob_name) 42 blob.upload_from_string(df.to_csv(index=flg_index, header=flg_header, sep=","))
requirements
1redash-dynamic-query==1.0.4 2pandas 3google-cloud-storage==1.23.0 4
試したこと
・ローカルでquery_id = 1200のクエリがDataFrame形式で抽出出来たのは確認。
・アップロードの部分だけ試そうと以下のコードを実行したのですが、今度は「NameError: name 'gcs' is not defined」などが出てくる次第です。
import pandas as pd from google.cloud import storage as gcs def hello_pubsub(a,b): project_id = "My First Project" bucket_name = "[バケット名]" gcs_path = "[ファイルパス]" client = gcs.Client(project_id) bucket = client.get_bucket(bucket_name) # 格納するGCSパスを指定 blob = bucket.blob(gcs_path) df = pd.DataFrame([[1,2,3],[5,6,7]],columns=["x","y","z"]) # DataFrameをGCSにUpload blob.upload_from_string(df.to_csv(index=flg_index, header=flg_header, sep=",")) print( "File {} uploaded to {}.".format( source_file_name, destination_blob_name ) )
requirements
1pandas 2google-cloud-storage==1.23.0 3
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー