将数据从API加载到BigQuery的首选方法是什么?

时间:2020-02-15 22:46:31

标签: python api google-cloud-platform google-bigquery etl

我正在尝试将数据从REST API导入Google Cloud Platform(GCP)上的BigQuery中。最好的方法是什么(不使用任何第三方工具,例如Funnel.io或Supermetrics)?

我可以找到的大多数教程都建议将数据作为CSV文件写入Cloud Storage,然后使用DataFlow将数据加载到BigQuery中。但是,这似乎有点麻烦。应该有一种方法,而无需中间步骤即可写入CSV。可以在GCP内实现吗?如果可以,最好的方法是什么?

PS:如果数据大小与答案有关:我正在尝试加载总计约10,000行的数据(一次),每天要添加约100个新列-理想情况下每小时更新一次。

2 个答案:

答案 0 :(得分:0)

根据documentation

当前,您只能从Cloud Storage或 可读的数据源(例如本地计算机)。

因此,除非您正在加载数据存储或Firestore导出,否则文件必须位于Google Cloud Storage中。 GCS有以下可用的可读格式:

Avro

CSV

JSON(仅限换行符分隔)

ORC

实木复合地板

数据存储区导出

Firestore出口

您应该注意limitations for each format。此外,加载作业也有局限性,它们在here中进行了描述。

我建议您以一种可读格式从Rest API中获取数据,将其存储在Google Cloud Storage中,然后使用Google Transfer Service将其加载到BigQuery中。因此,不必使用DataFlow。

Cloud Storage Transfer用于安排定期将数据直接加载到BigQuery中。根据文档,最小加载间隔为1小时,我相信这符合您的需求。您可以阅读有关此服务here的更多信息。

我希望这会有所帮助。

答案 1 :(得分:0)

按照上述@Kolban的提示进行操作,可以通过将数据“流式传输”到BigQuery中,而无需使用第三方工具并且无需将中间文件写入Google Cloud Storage即可将数据从API加载到BigQuery中:

rows_to_insert = [(u"Phred Phlyntstone", 32), (u"Wylma Phlyntstone", 29)]

errors = client.insert_rows(table, rows_to_insert)  # Make an API request.
if errors == []:
    print("New rows have been added.")

(来自BQ documentation

为了准备JSON数据,必须将其转换为元组。这是我的代码的摘录:

# Turn JSON into tuples
data_tuples = []
for key,value in resp_json[product_id].items():
    data_tuples.append((
        value["product_id"],
        value["downloads"]
        )
    )

# Insert into BQ
errors = client.insert_rows(table, data_tuples)
if errors == []:
    print("New rows have been added.")
else:
    print(errors)