Google BigQuery 是否足以存储财务报表?
Is Google BigQuery sufficient for financial statement storage?
我不完全知道标题是什么,因为这是一个复杂的情况。我目前正在从事一个项目,使用 Erply 的 API 从他们的 Erply 数据库中检索公司的财务报表(发票),然后将该数据传输到另一个数据库以使用 [=44= 对其进行一些简单的分析] 数据工作室。我目前有一个 google 云功能和 运行 检索数据并将其存储在 Google BigQuery 中。
主要问题:
BigQuery 是 append-only,我需要至少每天更新 BigQuery 中的数据,只有新条目。
Erply API 只允许一个人通过单个 API 调用检索(最多)100 张发票,然后可以检索下 100 张,但是有无法知道总共有多少张发票(因此,何时停止调用)或自上次检索以来哪些发票是新的。 (我不希望在此线程上收到对此的解决方案,但只是想我会提供所有信息)
我使用 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: '' }
让您的行被多次导入。我们总是这样做。然后我们有一个视图,例如:table_last,它从存储 table 中选取最近的行。此视图可以在报告中进一步使用,或者可以使用计划查询具体化为新的 table.
所以这里的建议是学习如何处理多行,你就有救了。
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
- 对于这个,您应该解析并规范化为 BQ 在摄取点接受的格式(如果这是云函数)。你也可以做一个技巧,如果你在 Cloud Function 中发现错误,你将它转发给另一个处理规范化的 GCF,它将处理坏行。
我也解决了我的部分问题,就部分失败错误而言,并从中获取了更多详细信息。这可能是显而易见的,但对我来说并非如此,它可能会对其他人有所帮助:
await bigqueryClient
.dataset(datasetId)
.table(tableId)
.insert(rows)
.catch(error => {
console.error(error['errors'][0]);
});
在将行插入 BigQuery 时捕获错误时,您可以 select 错误的某些部分以更详细地显示它们。这个特定的 selection 向我展示了插入时出现的问题。
我不完全知道标题是什么,因为这是一个复杂的情况。我目前正在从事一个项目,使用 Erply 的 API 从他们的 Erply 数据库中检索公司的财务报表(发票),然后将该数据传输到另一个数据库以使用 [=44= 对其进行一些简单的分析] 数据工作室。我目前有一个 google 云功能和 运行 检索数据并将其存储在 Google BigQuery 中。
主要问题:
BigQuery 是 append-only,我需要至少每天更新 BigQuery 中的数据,只有新条目。
Erply API 只允许一个人通过单个 API 调用检索(最多)100 张发票,然后可以检索下 100 张,但是有无法知道总共有多少张发票(因此,何时停止调用)或自上次检索以来哪些发票是新的。 (我不希望在此线程上收到对此的解决方案,但只是想我会提供所有信息)
我使用 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: '' }
让您的行被多次导入。我们总是这样做。然后我们有一个视图,例如:table_last,它从存储 table 中选取最近的行。此视图可以在报告中进一步使用,或者可以使用计划查询具体化为新的 table.
所以这里的建议是学习如何处理多行,你就有救了。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
- 对于这个,您应该解析并规范化为 BQ 在摄取点接受的格式(如果这是云函数)。你也可以做一个技巧,如果你在 Cloud Function 中发现错误,你将它转发给另一个处理规范化的 GCF,它将处理坏行。
我也解决了我的部分问题,就部分失败错误而言,并从中获取了更多详细信息。这可能是显而易见的,但对我来说并非如此,它可能会对其他人有所帮助:
await bigqueryClient
.dataset(datasetId)
.table(tableId)
.insert(rows)
.catch(error => {
console.error(error['errors'][0]);
});
在将行插入 BigQuery 时捕获错误时,您可以 select 错误的某些部分以更详细地显示它们。这个特定的 selection 向我展示了插入时出现的问题。