Используя Python 2.7, я обычно передаю запрос из BigQuery в ML Predict, который имеет определенный форматирующий запрос.
Во-первых: есть ли более простой способ перейти непосредственно от запроса BigQuery к JSON в правильном формате, чтобы его можно было передать в requests.post()
вместо прохождения через панды (насколько я понимаю, панды до сих пор не поддерживаются в стандарте GCP )
Второе: есть ли способ создать запрос для перехода непосредственно в формат JSON, а затем изменить JSON, чтобы отразить требования ML Predict JSON?
В настоящее время мой код выглядит так:
#I used the bigquery to dataframe option here to view the output.
#I would like to not use pandas in the end code.
logs = log_data.execute(output_options=bq.QueryOutput.dataframe()).result()
data = logs.to_json(orient='index')
print data
'{"0":{"end_time":"2018-04-19","device":"iPad","device_os":"iOS","device_os_version":"5.1.1","latency":0.150959,"megacycles":140.0,"cost":"1.3075e-08","device_brand":"Apple","device_family":"iPad","browser_version":"5.1","app":"567","ua_parse":"0"}}'
#The JSON needs to be in this format according to google documentation.
#data = {
# 'instances': [
# {
# 'key':'',
# 'end_time': '2018-04-19',
# 'device': 'iPad',
# 'device_os': 'iOS',
# 'device_os_version': '5.1.1',
# 'latency': 0.150959,
# 'megacycles':140.0,
# 'cost':'1.3075e-08',
# 'device_brand':'Apple',
# 'device_family':'iPad',
# 'browser_version':'5.1',
# 'app':'567',
# 'ua_parse':'40.9.8'
# }
# ]
#}
Таким образом, все, что мне нужно изменить, - это ведущий ключ от '0'
до 'instances'
, и я должен быть полностью настроен для передачи в `reports.post ().
Есть ли способ сделать это?
Редактировать-добавить запрос BigQuery:
%%bq query --n log_data
WITH `my.table` AS (
SELECT ARRAY<STRUCT<end_time STRING, device STRING, device_os STRING, device_os_version STRING, latency FLOAT64, megacycles FLOAT64,
cost STRING, device_brand STRING, device_family STRING, browser_version STRING, app STRING, ua_parse STRING>>[] instances
)
SELECT TO_JSON_STRING(t)
FROM `my.table` AS t
WHERE end_time >='2018-04-19'
LIMIT 1
data = log_data.execute().result()
Благодаря @MikhailBerlyant я настроил свой запрос и код так:
%%bq query --n log_data
SELECT [TO_JSON_STRING(t)] AS instance
FROM `yourproject.yourdataset.yourtable` AS t
WHERE end_time >='2018-04-19'
LIMIT 1
Но когда я запускаю команду execute logs = log_data.execute().result()
, я получаю это
Что приводит к этой ошибке при переходе в request.post
TypeError: QueryResultsTable job_zfVEiPdf2W6msBlT6bBLgMusF49E is not JSON serializable
Есть ли в execut () способ просто вернуть json?