[英]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.