【问题标题】:Is Google BigQuery sufficient for financial statement storage?Google BigQuery 是否足以存储财务报表?
【发布时间】:2019-11-25 10:33:42
【问题描述】:

我不完全知道该标题是什么,因为这是一个复杂的情况。我目前正在开展一个项目,使用 Erply 的 API 从一家公司的 Erply 数据库中检索财务报表(发票),然后将该数据传输到另一个数据库,以使用 Google Data Studio 对其进行一些简单的分析。我目前正在运行一个谷歌云功能,它可以检索数据并将其存储在 Google BigQuery 中。

主要问题:

  1. BigQuery 只能追加,我需要至少每天更新 BigQuery 中的数据,并且只包含新条目。

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

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

最后,我需要使用 BigQuery,因为它直接连接到 Google Data Studio,从而实现了非常方便且易于使用的设置(一旦数据实际上在 BigQuery 中)。我想知道的是,对于上述问题,我应该将数据直接导入 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: '' }

【问题讨论】:

    标签: node.js google-cloud-platform google-bigquery google-data-studio


    【解决方案1】:

    我还解决了部分问题,即部分失败错误并从中获取更多详细信息。这可能很明显,但对我来说不是,它可能对其他人有帮助:

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

    在将行插入 BigQuery 时发现错误时,您可以选择错误的某些部分以更详细地显示它们。这个特定的选择让我了解了插入时的问题。

    【讨论】:

      【解决方案2】:
      1. 让您的行被多次导入。我们总是这样做。然后我们有一个视图,例如:table_last,它从存储表中选择最近的行。此视图可以在报告中进一步使用,也可以使用计划查询对新表进行具体化。
        所以这里的建议是学习如何处理多行,你会得救的。

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

      pageNo - API 一次最多返回 recordsOnPage 项。到 检索下一个 recordsOnPage 项目,使用 pageNo 发送一个新请求 加一。默认情况下,API 返回“page 1”。

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

      1. 对于这个,您应该解析并规范化为 BQ 在摄取点接受的格式,如果这是一个云函数在那里执行。您还可以做一个小技巧,如果您在 Cloud Function 中发现错误,则将其转发到另一个处理规范化并处理错误行的 GCF。

      【讨论】:

      • 哇,感谢您的快速而有见地的回复!一个后续问题:我不知道你是否知道 Erply 或者你是否只是为这个线程研究过它,但是我看不到通过 Erply 的 API 找到总页数的方法,这就是我不想使用的原因那个方法。那么你将如何编写该代码?当没有更多页面并且遇到错误时,我遇到了某种带有捕获的 while 循环,但这似乎不是很好的编程礼仪。
      • 在此处阅读:learn-api.erply.com/requests/getsalesdocuments pageNo API 一次最多返回 recordsOnPage 项。要检索下一个 recordsOnPage 项目,请发送一个 pageNo 加一的新请求。默认情况下,API 返回“第 1 页”。
      • 这种技术称为滚动,您会一直进行下去,直到发现 API 返回的结果少于 recordsOnPage 项。
      猜你喜欢
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多