Google BigQuery 是否足以存储财务报表?

Is Google BigQuery sufficient for financial statement storage?

我不完全知道标题是什么,因为这是一个复杂的情况。我目前正在从事一个项目,使用 Erply 的 API 从他们的 Erply 数据库中检索公司的财务报表(发票),然后将该数据传输到另一个数据库以使用 [=44= 对其进行一些简单的分析] 数据工作室。我目前有一个 google 云功能和 运行 检索数据并将其存储在 Google BigQuery 中。

主要问题:

  1. BigQuery 是 append-only,我需要至少每天更新 BigQuery 中的数据,只有新条目。

  2. Erply API 只允许一个人通过单个 API 调用检索(最多)100 张发票,然后可以检索下 100 张,但是有无法知道总共有多少张发票(因此,何时停止调用)或自上次检索以来哪些发票是新的。 (我不希望在此线程上收到对此的解决方案,但只是想我会提供所有信息)

  3. 我使用 BigQuery 的自动模式生成器,给它一个包含大约 20 张发票的 json 文件,但是,我从 Erply 提取的数据似乎并不总是严格遵守这个模式(它们都有完全相同的键,但并不总是用正确的值格式填充)因此我在尝试将数据推送到 BigQuery 时遇到部分错误失败(由于大量发票不完全符合模式)。 下面 code-block 中给出的示例。 我无法理解此错误消息,希望看到更多 in-depth 对每次失败的解释,以尝试缩小范围key-value 对格式不同并导致错误。

最后,我需要使用 BigQuery,因为它直接连接到 Google Data Studio,从而实现非常方便且易于使用的设置(一旦数据实际上在 BigQuery 中)。我想知道的是,对于 above-mentioned 问题,我应该将数据直接导入 BigQuery 吗?或者我应该使用另一个 GCP 存储选项并将其链接到 BigQuery 吗?

对于个别问题的任何答案也将不胜感激,如果您需要更多信息,请告诉我。

{ PartialFailureError
    at request (/srv/node_modules/@google-cloud/bigquery/build/src/table.js:1550:23)
    at Util.handleResp (/srv/node_modules/@google-cloud/bigquery/node_modules/@google-cloud/common/build/src/util.js:142:9)
    at retryRequest (/srv/node_modules/@google-cloud/bigquery/node_modules/@google-cloud/common/build/src/util.js:417:22)
    at onResponse (/srv/node_modules/retry-request/index.js:206:7)
    at /srv/node_modules/teeny-request/build/src/index.js:208:13
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)
  errors: 
   [ { errors: [Array], row: [Object] },
     { errors: [Array], row: [Object] },
     { errors: [Array], row: [Object] },
     { errors: [Array], row: [Object] } ],
  name: 'PartialFailureError',
  response: 
   { kind: 'bigquery#tableDataInsertAllResponse',
     insertErrors: 
      [ [Object],
        [Object],
        [Object],
        [Object] ] },
  message: '' }
  1. 让您的行被多次导入。我们总是这样做。然后我们有一个视图,例如:table_last,它从存储 table 中选取最近的行。此视图可以在报告中进一步使用,或者可以使用计划查询具体化为新的 table.
    所以这里的建议是学习如何处理多行,你就有救了。

  2. Erply 在 API 中构建了分页,因此您一次只需分页 100,直到到达结尾。

pageNo - API returns at most recordsOnPage items at a time. To retrive the next recordsOnPage items, send a new request with pageNo incremented by one. By default, API returns "page 1".

https://learn-api.erply.com/requests/getsalesdocuments

  1. 对于这个,您应该解析并规范化为 BQ 在摄取点接受的格式(如果这是云函数)。你也可以做一个技巧,如果你在 Cloud Function 中发现错误,你将它转发给另一个处理规范化的 GCF,它将处理坏行。

我也解决了我的部分问题,就部分失败错误而言,并从中获取了更多详细信息。这可能是显而易见的,但对我来说并非如此,它可能会对其他人有所帮助:

await bigqueryClient
    .dataset(datasetId)
    .table(tableId)
    .insert(rows)
    .catch(error => {
      console.error(error['errors'][0]);
    });

在将行插入 BigQuery 时捕获错误时,您可以 select 错误的某些部分以更详细地显示它们。这个特定的 selection 向我展示了插入时出现的问题。