Получение ошибки. При добавлении убедитесь, что структура и типы данных в DataFrame соответствуют схеме таблицы назначения. - PullRequest
0 голосов
/ 03 мая 2020

Я запускаю al oop, который запустит какой-то процесс, создаст фрейм данных, а затем фрейм данных будет добавлен в большую таблицу запросов. Но когда я добавляю в существующую таблицу, я получаю ошибку. Убедитесь, что структура и типы данных в DataFrame соответствуют схеме таблицы назначения. Значения поступают из функций.

from  pandas.io import gbq
import pandas as pd
import numpy as np
import datetime as dt
from datalab.context import Context
import time

for id_name in ID_:
      df= ['id_recip','length_data','length_action', 'daily_mail_freq', 'weekly_mail_frequency', 'imp_hour', 'imp_day']
      columns = list(df)
      data=[]
      values = [id_name,length_data,length_action, daily_mail, weekly_mail, imp_hour, imp_day]
      zipped = zip(columns, values)
      a_dictionary = dict(zipped)
      print(a_dictionary)
      final_output=pd.DataFrame(a_dictionary)
      final_output = final_output.astype(str)
      final_output.info()
      final_output.to_gbq('internal.frequency_output3',
                            Context.default().project_id,
                            if_exists='append')

Я преобразовал все данные в кадре данных в строку, чтобы избежать несоответствия типов данных. Сначала создается таблица l oop, если ее не существует.

Structure in bigquery table  
daily_mail_freq STRING NULLABLE 
id_recip STRING  NULLABLE 
imp_day STRING NULLABLE 
imp_hour  STRING NULLABLE
length_action  STRING NULLABLE 
length_data STRING  NULLABLE
weekly_mail_frequency STRING  NULLABLE

В них нет дат

1 Ответ

1 голос
/ 04 мая 2020

Один из способов сделать это - использовать google.cloud bigquery. в этом случае он меняется на оператор sql и данные pu sh вместо использования фрейма данных.

def export_items_to_bigquery(daily_mail_freq,id_recip,imp_day,imp_hour,length_action,length_data,weekly_mail_frequency ):
    # Instantiates a client
    client = bigquery.Client()
    bigquery_client = bigquery.Client()

    # Prepares a reference to the dataset
    dataset_ref = bigquery_client.dataset('dbn')

    table_ref = dataset_ref.table('fqo')
    table = bigquery_client.get_table(table_ref)  

    rows_to_insert = [
        (daily_mail_freq , id_recip, imp_day, imp_hour, length_action , length_data, weekly_mail_frequency)]
    errors = bigquery_client.insert_rows(table, rows_to_insert)  # API request
    assert errors == [] 

теперь в l oop просто передает данные в функцию

...