繁体   English   中英

数据停止推送到 bigquery

[英]Data stops pushing to bigquery

我正在尝试通过使用 cursor 的 fetch 将数据从 postgresql db 加载到 bigquery,但问题是它不会将足够的数据推送到 BQ,它只插入了第一批(1000 行)并且在日志中也没有错误.

如果这段代码在我的笔记本电脑上运行,它会运行良好。 但是,如果我把它带到 GCP Composer 中,情况就不同了。

数据仅包含8列,4列int值范围从1到20M(如user_id),2列包含字符串(如user_name,hash),2列包含日期值(created_date,dwh_created_date)。 总行数约为 100k。

下面是我的代码。 我已经尝试为每次提取输入睡眠时间,因为我认为它需要时间来处理,也可能谷歌会对 API 请求有间隔时间。 数据框包含足够的数据,所以我怀疑应该还有其他东西。

with cursor:
    cursor.execute(sql_query)
    while True:
        rows = cursor.fetchmany(1000)
        if not rows:
            break
        logger.info(f"rows :{len(rows)}")
        column_names = [desc[0] for desc in cursor.description]
        logger.info(f"Column name: {column_names}")
        df = pd.DataFrame(rows, columns=column_names)
        df.reset_index(drop=True, inplace=True)
        if schema_dict is not None and selected_column is not None:
            df = df[selected_column]
            df = convert_pandas_datatype(df, schema_dict)
        client.load_table_from_dataframe(
            df,
            table_id,
            job_config=job_config
        )
        # from time import sleep
        # sleep(5)
        # print("sleeping............")
conn.close()

那么我怎样才能输入足够的数据到 BigQuery ..

根据谷歌云文档等待作业完成,您需要使用 result() function。job.result() function 将等待作业完成。 示例: rows = query_job.result() 您可以按如下方式编辑代码:

with cursor:
    cursor.execute(sql_query)
    while True:
        rows = cursor.fetchmany(1000)
        if not rows:
            break
        logger.info(f"rows :{len(rows)}")
        column_names = [desc[0] for desc in cursor.description]
        logger.info(f"Column name: {column_names}")
        df = pd.DataFrame(rows, columns=column_names)
        df.reset_index(drop=True, inplace=True)
        if schema_dict is not None and selected_column is not None:
            df = df[selected_column]
            df = convert_pandas_datatype(df, schema_dict)
       job= client.load_table_from_dataframe(
            df,
            table_id,
            job_config=job_config
        )
       job.result()
       
conn.close()

切勿不必要地使用sleep() function,因为此方法会将当前线程的执行暂停给定的秒数。 这会产生不必要的问题。 欲了解更多信息,您可以点击此链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM