Python 获得;禁止:403超出速率限制:此表的表更新操作太多;将CSV文件从云存储加载到大查询时
我正在尝试使用Python中的cloud函数将云csv文件数据加载到大查询表中。我的代码用于10行的数据,但是在将行数超过1000行之后,它抛出了下面的错误。共19列,共1000行Python 获得;禁止:403超出速率限制:此表的表更新操作太多;将CSV文件从云存储加载到大查询时,python,google-cloud-platform,google-bigquery,google-cloud-functions,google-cloud-storage,Python,Google Cloud Platform,Google Bigquery,Google Cloud Functions,Google Cloud Storage,我正在尝试使用Python中的cloud函数将云csv文件数据加载到大查询表中。我的代码用于10行的数据,但是在将行数超过1000行之后,它抛出了下面的错误。共19列,共1000行 当有人在云存储中上载包含更新数据的csv文件时,该函数仅被调用一次。频率将非常低,即每月一次 禁止:403超出速率限制:此表的表更新操作太多 下面是代码 def hello_gcs(event, context): print('Event ID: {}'.format(context.event_id)) prin
当有人在云存储中上载包含更新数据的csv文件时,该函数仅被调用一次。频率将非常低,即每月一次 禁止:403超出速率限制:此表的表更新操作太多 下面是代码
def hello_gcs(event, context):
print('Event ID: {}'.format(context.event_id))
print('Event type: {}'.format(context.event_type))
print('Bucket: {}'.format(event['bucket']))
print('File: {}'.format(event['name']))
print('Metageneration: {}'.format(event['metageneration']))
print('Created: {}'.format(event['timeCreated']))
print('Updated: {}'.format(event['updated']))
if event['name'] == "DUMMY FLIGHT DETAIL LIST 18012021.csv":
print('blob checking: {}'.format(event['name']))
def inner_function():
from google.cloud import bigquery
# Construct a BigQuery client object.
client = bigquery.Client()
# TODO(developer): Set table_id to the ID of the table to create.
table_id = "project-a-307309.DatasetA.TableE"
load_job = client.delete_table(table_id, not_found_ok=True) # Make an API request.
print("Deleted table '{}'.".format(table_id))
job_config = bigquery.LoadJobConfig(
schema=[
bigquery.SchemaField("ID", "STRING"),
bigquery.SchemaField("STATUS", "STRING"),
bigquery.SchemaField("PRIORITY", "STRING"),
bigquery.SchemaField("BRAND", "STRING"),
bigquery.SchemaField("FLIGHT_NAME", "STRING"),
bigquery.SchemaField("FLIGHT_TYPE", "STRING"),
bigquery.SchemaField("City", "STRING"),
bigquery.SchemaField("Destination_Tier", "STRING"),
bigquery.SchemaField("Country", "STRING"),
bigquery.SchemaField("Management_Type", "STRING"),
bigquery.SchemaField("Area", "STRING"),
bigquery.SchemaField("Seat_Count", "STRING"),
bigquery.SchemaField("Tier", "STRING"),
bigquery.SchemaField("New_Segment", "STRING"),
bigquery.SchemaField("Running_Date", "STRING"),
bigquery.SchemaField("Expected_Opening", "STRING"),
bigquery.SchemaField("New_Updated_Opening", "STRING"),
bigquery.SchemaField("COMMENT", "STRING"),
bigquery.SchemaField("URL", "STRING")
],
skip_leading_rows=6,
# The source format defaults to CSV, so the line below is optional.
source_format=bigquery.SourceFormat.CSV,
)
uri = "gs://dummy_flight_details/DUMMY FLIGHT DETAIL LIST 18012021.csv"
load_job = client.load_table_from_uri(
uri, table_id, job_config=job_config
) # Make an API request.
load_job.result() # Waits for the job to complete.
destination_table = client.get_table(table_id) # Make an API request.
print("Loaded {} rows.".format(destination_table.num_rows))
inner_function()
def outer_func():
from google.cloud import storage
import time
ts = time.time()
print("ts")
print(ts)
bucket_name = "dummy_flight_details"
blob_name = "DUMMY FLIGHT DETAIL LIST 18012021.csv"
new_name = "DUMMY FLIGHT DETAIL LIST 18012021.csv".format(ts)
def rename_blob():
print("function entered")
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob = bucket.blob(blob_name)
new_blob = bucket.rename_blob(blob, new_name)
print("Blob {} has been renamed to {}".format(blob.name, new_blob.name))
rename_blob()
outer_func()
要求文本
# Function dependencies, for example:
# package>=version
google-cloud-bigquery==2.11.0
google-cloud-storage==1.35.0
日志
Traceback (most recent call last): File "/layers/google.python.pip/pip/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app response = self.full_dispatch_request() File "/layers/google.python.pip/pip/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request rv = self.handle_user_exception(e) File "/layers/google.python.pip/pip/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception reraise(exc_type, exc_value, tb) File "/layers/google.python.pip/pip/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise raise value File "/layers/google.python.pip/pip/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request rv = self.dispatch_request() File "/layers/google.python.pip/pip/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/layers/google.python.pip/pip/lib/python3.8/site-packages/functions_framework/__init__.py", line 149, in view_func function(data, context) File "/workspace/main.py", line 52, in hello_gcs inner_function() File "/workspace/main.py", line 49, in inner_function load_job.result() # Waits for the job to complete. File "/layers/google.python.pip/pip/lib/python3.8/site-packages/google/cloud/bigquery/job/base.py", line 662, in result return super(_AsyncJob, self).result(timeout=timeout, **kwargs) File "/layers/google.python.pip/pip/lib/python3.8/site-packages/google/api_core/future/polling.py", line 134, in result raise self._exception google.api_core.exceptions.Forbidden: 403 Exceeded rate limits: too many table update operations for this table. For more information, see https://cloud.google.com/bigquery/troubleshooting-errors
您可能希望查看此页面:
并检查您的云函数被调用的次数和频率…您可以查看此页面:
检查您的云函数被调用的次数和频率…据我所知,您已经创建了一个无限循环。这样你就达到了通话的极限 仔细查看您的代码。首先,您说过“每次有人将文件放入存储桶时,该函数都会触发”。好的,不用担心 但是,最后你做了那件事
new_blob = bucket.rename_blob(blob, new_name)
重命名不存在,它只是旧blob到新blob的副本,以及旧blob的删除(如果旧名称与新名称不同)
因此,一个副本就是一个新blob的创建,因此GCS会触发一个新事件来运行您的函数
因为代码中有一个bug,所以新的blob名称与初始名称相同
new_name = "DUMMY FLIGHT DETAIL LIST 18012021.csv".format(ts)
字符串中缺少大括号,格式不起任何作用
传递IF的相同名称、在循环中创建的相同文件名(“重命名”),以及在循环中触发的事件
与文件大小/行数无关。据我所知,您创建了一个无限循环。这样你就达到了通话的极限 仔细查看您的代码。首先,您说过“每次有人将文件放入存储桶时,该函数都会触发”。好的,不用担心 但是,最后你做了那件事
new_blob = bucket.rename_blob(blob, new_name)
重命名不存在,它只是旧blob到新blob的副本,以及旧blob的删除(如果旧名称与新名称不同)
因此,一个副本就是一个新blob的创建,因此GCS会触发一个新事件来运行您的函数
因为代码中有一个bug,所以新的blob名称与初始名称相同
new_name = "DUMMY FLIGHT DETAIL LIST 18012021.csv".format(ts)
字符串中缺少大括号,格式不起任何作用
传递IF的相同名称、在循环中创建的相同文件名(“重命名”),以及在循环中触发的事件
与文件大小/行数无关。只有当有人在云存储中上载带有更新数据的csv文件时,才会调用该函数。频率将非常低,即每月调用一次。只有当有人在云存储中上载带有更新数据的csv文件时,才会调用该函数。频率将非常低,即每月一次。我相信@guillaume有正确的答案。要确认这一点,请查看BigQuery日志以查看创建了哪些作业。我相信@guillaume的答案是正确的。要确认,请查看BigQuery日志以查看创建了哪些作业。反馈非常好。BigQuery是否在云日志中记录详细信息以帮助检测此类问题?在BigQuery中,您应该能够看到触发的许多作业。但我认为这更容易在云函数中检测到,而云函数实际上就是无限循环发生的地方。@Guillaume,是的,它与配额无关。代码在添加了{}即“虚拟飞行详细信息列表18012021.csv.{}”格式(ts)后工作。反馈非常好。BigQuery是否在云日志中记录详细信息以帮助检测此类问题?在BigQuery中,您应该能够看到触发的许多作业。但我认为这更容易在云函数中检测到,而云函数实际上就是无限循环发生的地方。@Guillaume,是的,它与配额无关。代码在添加{}即“虚拟飞行详细信息列表18012021.csv.{}”格式(ts)后生效。