这对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从here摘录的样本作为附注。
这样就得到了131行:
我希望能够做的是使用ScalarQueryParameter,这样我就可以通过编程的方式使用一些var。如下所示:
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有没有人能告诉我怎样才能达到上述目的?
附注- '1XPTgDRhN8RFnzniWCddobD9iKZatrvH4‘是Laszlo’s Pizza 10.000比特币交易所(1000000000000萨托什)。
发布于 2018-05-28 09:09:27
所以..。问题出在这行代码并没有像预期的那样工作。不知道为什么,因为它可以处理没有参数化变量的查询。
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)干杯
https://stackoverflow.com/questions/50553749
复制相似问题