如何在第三方 API 中发出请求并在 google BigQuery 上定期加载结果?我应该使用哪些谷歌服务?

Posted

技术标签:

【中文标题】如何在第三方 API 中发出请求并在 google BigQuery 上定期加载结果?我应该使用哪些谷歌服务?【英文标题】:How to make requests in third party APIs and load the results periodically on google BigQuery? What google services should I use? 【发布时间】:2019-08-23 18:26:08 【问题描述】:

我需要从第三方 API 获取数据并将其提取到 Google BigQuery 中。也许,我需要通过谷歌服务来自动化这个过程来定期做。

我正在尝试使用 Cloud Functions,但它需要一个触发器。我还阅读了有关 App Engine 的信息,但我认为它不适合仅使用一种功能来发出拉取请求。

另一个疑问是:我需要将数据加载到云存储中还是可以直接将其加载到 BigQuery?我应该使用 Dataflow 并进行任何配置吗?

def upload_blob(bucket_name, request_url, destination_blob_name):
    """
    Uploads a file to the bucket.
    """
    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucket_name)
    blob = bucket.blob(destination_blob_name)

    request_json = requests.get(request_url['url'])

    print('File  uploaded to .'.format(
        bucket_name,
        destination_blob_name))

def func_data(request_url):
    BUCKET_NAME = 'dataprep-staging'
    BLOB_NAME = 'any_name'
    BLOB_STR = '"blob": "some json"'

    upload_blob(BUCKET_NAME, request_url, BLOB_NAME)
    return f'Success!'

我希望获得有关我应该用于创建此管道的架构(谷歌服务)的建议。例如,使用云函数(从 API 获取数据),然后使用服务“X”安排作业将数据输入到存储中,最后从存储中提取数据。

【问题讨论】:

【参考方案1】:

你可以使用函数。创建一个http triggered function 并使用cloud scheduler 定期调用它。

对了,你也可以调用appengine或者cloud run的http端点。

关于存储,答案是否定的。如果 API 结果对于函数允许的内存来说不是太大,你 can write in /tmp directory 和 load data to bigquery with this file。如果需要,您可以将函数大小调整为 2go

【讨论】:

谢谢@guilhaume!这就是我一直在寻找的答案。或许,云存储是暂存区,“原始”数据不应该集中在那里吗? 存储很便宜。最好的做法之一(如果你有现金的话)是保留所有东西,以防将来需要。您(也许)从未使用过的数据可以存储在冷线中,存储非常实惠。考虑压缩它们。因此,所有这些都是为了回答您:您可以(必须?)将所有数据保存在不同的阶段。原始的、中间的和最终的。存储是非结构化数据的理想场所。对于结构,请考虑 bigQuery(带分区!!)。仓储价格不变,90天后自动切换冷线,查询方便。 完美!谢谢。

以上是关于如何在第三方 API 中发出请求并在 google BigQuery 上定期加载结果?我应该使用哪些谷歌服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Apps 脚本中使用 UrlFetchApp 发出 Drive API 批处理请求

如何向 Google Site Search XML API 发出跨域浏览器请求?

可以向 Google Maps API 发出多少请求而不被禁止?

向 Google Play Android Developer API 发出 HTTP 发布请求

错误:使用 Fetch API 向第三方 API 发出 GET 请求时出现“TypeError:无法获取”

有啥方法可以从 google contact api v3 检索 account_id 以向 google people api 发出获取请求?