Форматирование запроса Biquery для ML соответствующего JSON для прохождения через ML Predict - PullRequest
0 голосов
/ 25 апреля 2018

Используя 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(), я получаю это enter image description here

Что приводит к этой ошибке при переходе в request.post

TypeError: QueryResultsTable job_zfVEiPdf2W6msBlT6bBLgMusF49E is not JSON serializable

Есть ли в execut () способ просто вернуть json?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

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

Мне удалось написать функцию, которая отформатировала запрос так, как Google ML Predict хочет, чтобы он передавался в запросы .post ().Скорее всего, это ужасный способ сделать это, но я не смог найти прямой путь от BigQuery к ML Predict в правильном формате.

def logs(query):
  client = gcb.Client()
  query_job = client.query(query)
  CSV_COLUMNS ='end_time,device,device_os,device_os_version,latency,megacycles,cost,device_brand,device_family,browser_version,app,ua_parse'.split(',')

  for row in query_job.result():
    var = list(row)
    l1 = dict(zip(CSV_COLUMNS,var))
    l1.update({'key':''})
    l2 = {'instances':[l1]}
  return l2
0 голосов
/ 25 апреля 2018

Во-первых: есть ли более простой способ перейти непосредственно от запроса BigQuery к JSON в правильном формате

См. Пример ниже

#standardSQL
WITH yourTable AS (
  SELECT ARRAY<STRUCT<id INT64, type STRING>>[(1, 'abc'), (2, 'xyz')] instances
)
SELECT TO_JSON_STRING(t)
FROM yourTable t 

с результатомв формате, который вы просили:

{"instances":[{"id":1,"type":"abc"},{"id":2,"type":"xyz"}]}  

Выше демонстрирует запрос и как он будет работать
В вашем реальном случае - вы должны использовать что-то вроде ниже

SELECT TO_JSON_STRING(t)
FROM `yourproject.yourdataset.yourtable` AS t
WHERE end_time >='2018-04-19'
LIMIT 1

надеюсь, что этопомогает: o)

Обновление на основе комментариев

SELECT [TO_JSON_STRING(t)] AS instance
FROM `yourproject.yourdataset.yourtable` t    
WHERE end_time >='2018-04-19'
LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...