Выполнение параметризованных запросов - PullRequest
0 голосов
/ 27 мая 2018

Совершенно новый для этой вещи Google BigQuery SQL, поэтому, пожалуйста, потерпите меня.Я пытаюсь построить google standardSQL параметризованный запрос.Следующий образец использовался и успешно работал на Google BigQuery WebUI .

#standardSQL
    WITH time AS 
        (
            SELECT TIMESTAMP_MILLIS(timestamp) AS trans_time,
                inputs.input_pubkey_base58 AS input_key,
                outputs.output_pubkey_base58 AS output_key,
                outputs.output_satoshis AS satoshis,
                transaction_id AS trans_id
            FROM `bigquery-public-data.bitcoin_blockchain.transactions`
                JOIN UNNEST (inputs) AS inputs
                JOIN UNNEST (outputs) AS outputs
                WHERE inputs.input_pubkey_base58 = '1XPTgDRhN8RFnzniWCddobD9iKZatrvH4'
                OR outputs.output_pubkey_base58 = '1XPTgDRhN8RFnzniWCddobD9iKZatrvH4'
        )
    SELECT input_key, output_key, satoshis, trans_id,
        EXTRACT(DATE FROM trans_time) AS date
    FROM time
      WHERE trans_time >= '2010-05-21' AND trans_time <= '2010-05-23' AND satoshis >= 1000000000000
    --ORDER BY date

Образец, извлеченный из здесь в качестве примечания.

Thisдает 131 строку:

Пример таблицы

Я хотел бы иметь возможность использовать ScalarQueryParameter, чтобы я мог программно использовать некоторые переменные по пути,Вот так:

myquery = """
#standardSQL
    WITH time AS 
        (
            SELECT TIMESTAMP_MILLIS(timestamp) AS trans_time,
                inputs.input_pubkey_base58 AS input_key,
                outputs.output_pubkey_base58 AS output_key,
                outputs.output_satoshis AS satoshis,
                transaction_id AS trans_id
            FROM `bigquery-public-data.bitcoin_blockchain.transactions`
                JOIN UNNEST (inputs) AS inputs
                JOIN UNNEST (outputs) AS outputs
                WHERE inputs.input_pubkey_base58 = @pubkey
                OR outputs.output_pubkey_base58 = @pubkey
        )
    SELECT input_key, output_key, satoshis, trans_id,
        EXTRACT(DATE FROM trans_time) AS date
    FROM time
      WHERE trans_time >= @mdate AND trans_time <= @tdate AND satoshis >= 1000000000000
    --ORDER BY date
"""

varInitDate = '2010-05-21'
varEndDate = '2010-05-23'
pubkey = '1XPTgDRhN8RFnzniWCddobD9iKZatrvH4'

query_params = [
    bigquery.ScalarQueryParameter('mdate', 'STRING', varInitDate),
    bigquery.ScalarQueryParameter('tdate', 'STRING', varEndDate),
    bigquery.ScalarQueryParameter('pubkey', 'STRING', pubkey)
]

job_config = bigquery.QueryJobConfig()
job_config.query_parameters = query_params
query_job = client.query(myquery,job_config=job_config)

Тем не менее, я сталкиваюсь со следующей ошибкой:

<google.cloud.bigquery.table.RowIterator object at 0x7fa098be85f8>
Traceback...
TypeError: 'RowIterator' object is not callable

Может кто-нибудь, пожалуйста, просветите меня, как мне достичь упомянутой цели?

PS - ' 1XPTgDRhN8RFnzniWCddobD9iKZatrvH4 ' - это Laszlo's Pizza 10.000 биткойн-обмен (1000000000000 сатоши).

1 Ответ

0 голосов
/ 28 мая 2018

Итак ... проблема была в этой строке кода, которая работала не так, как ожидалось.Хотя не уверен, почему, поскольку он работал с запросами, которые не имели параметризованных переменных.

results = query_job.result()
df = results().to_dataframe()

И фактический код ... Не забудьте заменить вашими учетными данными для входа в систему, чтобы это работало.

import datetime, time
from google.cloud import bigquery
from google.oauth2 import service_account
import pandas as pd

#login
credentials = service_account.Credentials.from_service_account_file('your.json')
project_id = 'your-named-project'
client = bigquery.Client(credentials= credentials,project=project_id)

#The query
q_input = """
#standardSQL
        WITH time AS 
            (
                SELECT TIMESTAMP_MILLIS(timestamp) AS trans_time,
                    inputs.input_pubkey_base58 AS input_key,
                    outputs.output_pubkey_base58 AS output_key,
                    outputs.output_satoshis AS satoshis,
                    transaction_id AS trans_id
                FROM `bigquery-public-data.bitcoin_blockchain.transactions`
                    JOIN UNNEST (inputs) AS inputs
                    JOIN UNNEST (outputs) AS outputs
                    WHERE inputs.input_pubkey_base58 = @pubkey
                    OR outputs.output_pubkey_base58 = @pubkey
            )
        SELECT input_key, output_key, satoshis, trans_id,
            EXTRACT(DATE FROM trans_time) AS date
        FROM time
          WHERE trans_time >= @mdate AND trans_time <= @tdate AND satoshis >= @satoshis
        --ORDER BY date
"""

#The desired purpose
def runQueryTransaction(varInitDate,varEndDate,pubkey,satoshis):
    global df
    query_params = [
        bigquery.ScalarQueryParameter('mdate', 'STRING', varInitDate),
        bigquery.ScalarQueryParameter('tdate', 'STRING', varEndDate),
        bigquery.ScalarQueryParameter('pubkey', 'STRING', pubkey),
        bigquery.ScalarQueryParameter('satoshis', 'INT64', satoshis),
    ]
    job_config = bigquery.QueryJobConfig()
    job_config.query_parameters = query_params
    query_job = client.query(q_input,job_config=job_config)  # API request - starts the query
    results = query_job.result()  # Waits for job to complete.
    df=pd.DataFrame(columns=['input_key', 'output_key', 'satoshis', 'trans_id', 'date'])
    for row in results:
        df.loc[len(df)] = [row.input_key, row.output_key, row.satoshis, row.trans_id, row.date]
        #print("{} : {} : {} : {} : {}".format(row.input_key, row.output_key, row.satoshis, row.trans_id, row.date))
    return df

#runQueryTransaction(InitialDate,EndDate,WalletPublicKey,Satoshis)
runQueryTransaction('2010-05-21','2010-05-23','1XPTgDRhN8RFnzniWCddobD9iKZatrvH4',1000000000000)

Приветствия

...