Bigquery Partition Date Python - PullRequest
       6

Bigquery Partition Date Python

0 голосов
/ 01 апреля 2020

Я хотел бы написать другую таблицу по дате разбиения таблицы в bigquery. Но я не мог найти, как это сделать. Я использую Python и облачную библиотеку Google. Я хочу создать таблицу с использованием стандартного SQL. Но я получаю сообщение об ошибке.

Ошибка: google.api_core.exceptions.BadRequest: 400 GET https://bigquery.googleapis.com/bigquery/v2/projects/astute-baton-272707/queries/f4b9dadb-1390-4260-bb0e-fb525aff662c?maxResults=0&location=US: количество столбцов в списке определения столбцов не совпадает число столбцов, созданных запросом в [2:72]

Пожалуйста, дайте мне знать, если есть другое решение. Ежедневно вставляйте в таблицу следующую стадию проекта.

Возможно, я делал это неправильно с самого начала. Я не уверен.

Спасибо.

client = bigquery.Client()

sql = """
CREATE OR REPLACE TABLE zzzzz.xxxxx.yyyyy (visitStartTime_ts INT64,date TIMESTAMP,hitsTime_ts INT64,appId STRING,fullVisitorId STRING,cUserId STRING,eventCategory STRING,eventLabel STRING,player_type STRING,PLAY_SESSION_ID STRING,CHANNEL_ID STRING,CONTENT_EPG_ID STRING,OFF_SET STRING)
 PARTITION BY date 
 OPTIONS (
   description="weather stations with precipitation, partitioned by day"
 ) AS 
select  
FORMAT_TIMESTAMP("%Y-%m-%d %H:%M:%S", TIMESTAMP_SECONDS(SAFE_CAST(visitStartTime AS INT64)), "Turkey") AS visitStartTime_ts,
date
,FORMAT_TIMESTAMP("%Y-%m-%d %H:%M:%S", TIMESTAMP_SECONDS(SAFE_CAST(visitStartTime+(h.time/1000) AS INT64)), "Turkey") AS hitsTime_ts
,h.appInfo.appId as appId
,fullVisitorId
,(SELECT  value FROM h.customDimensions where index=1) as cUserId
,h.eventInfo.eventCategory as eventCategory
,h.eventInfo.eventAction as eventAction
,h.eventInfo.eventLabel as eventLabel
,REPLACE(SPLIT(h.eventInfo.eventCategory,'/{')[OFFSET(1)],'}','') as player_type
,SPLIT(h.eventInfo.eventLabel,'|')[OFFSET(0)] as PLAY_SESSION_ID
,SPLIT(h.eventInfo.eventLabel,'|')[OFFSET(1)] as CHANNEL_ID
,SPLIT(h.eventInfo.eventLabel,'|')[OFFSET(2)] as CONTENT_EPG_ID
,SPLIT(h.eventInfo.eventLabel,'|')[OFFSET(3)] as OFF_SET 
FROM `zzzzz.yyyyyy.xxxxxx*` a,
UNNEST(hits) AS h
where 
1=1 
and SPLIT(SPLIT(h.eventInfo.eventCategory,'/{')[OFFSET(0)],'/')[OFFSET(0)] like 'player' 
and  _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
AND FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
AND (BYTE_LENGTH(h.eventInfo.eventCategory) - BYTE_LENGTH(REPLACE(h.eventInfo.eventCategory,'/{','')))/2 + 1 = 2
AND h.eventInfo.eventAction='heartBeat' 
"""

job = client.query(sql)  # API request.
job.result() 


query_job.result()  # Waits for the query to finish
print('Query results loaded to table {}'.format(table_ref.path))

1 Ответ

1 голос
/ 02 апреля 2020

Быстрое решение проблемы, представленной здесь: при создании таблицы вам не нужно объявлять ее схему, если есть запрос, откуда поступают данные. Прямо сейчас существует конфликт между данными и объявленной схемой. Поэтому удалите один.

Вместо того, чтобы начинать запрос с:

CREATE OR REPLACE TABLE zzzzz.xxxxx.yyyyy (visitStartTime_ts INT64,date TIMESTAMP,hitsTime_ts INT64,appId STRING,fullVisitorId STRING,cUserId STRING,eventCategory STRING,eventLabel STRING,player_type STRING,PLAY_SESSION_ID STRING,CHANNEL_ID STRING,CONTENT_EPG_ID STRING,OFF_SET STRING)
PARTITION BY date

Начните запрос с:

CREATE OR REPLACE TABLE zzzzz.xxxxx.yyyyy 
PARTITION BY date
...