使用现有 JSON 文件,如何将此数据上传到 BigQuery 并使用 JSON 文件中的数据计算新字段?

Posted

技术标签:

【中文标题】使用现有 JSON 文件,如何将此数据上传到 BigQuery 并使用 JSON 文件中的数据计算新字段?【英文标题】:With an existing JSON file, how do I upload this data to BigQuery and calculate a new field with data in the JSON file? 【发布时间】:2018-08-08 16:09:18 【问题描述】:

我有一个新行分隔的 JSON 文件,我将上传到 BigQuery。

JSON 文件的每一行都包含许多字段,我想将其中两个添加在一起,以形成一个包含两个添加在一起的值的新列。

但是,有数百万条记录,我宁愿在 JSON 完全上传后不使用 SQL 来执行此操作。

有什么过程可以完成我正在寻找的东西吗?

也许在 JSON 模式中?或者可能是我将 JSON 和 JSON 架构上传到 BigQuery 的方式?

非常感谢! :)

【问题讨论】:

"在 JSON 完全上传后,我宁愿不使用 SQL 来执行此操作。"为什么?那将是最简单的方法。 因为这是目前对我的要求。我有一个 JSON 文件,在数据库中没有我需要的值,之后我无法使用 SQL 添加列。这些是我被要求处理的限制,除非我可以报告否则不可能这样做。 不能同时加载和转换。相反,您需要加载数据然后对其进行转换,或者定义 external table 并对其运行查询以写入新表。 谢谢,来自谷歌员工的回答就足够了。我的老板似乎很满意我们现在必须以不同的方式处理它。谢谢! 仅供参考 JSON Schema 不进行 JSON 转换。 JSON Schema(主要)用于定义 JSON 的结构以进行验证。 【参考方案1】:

查看我的“lazy data loading in BigQuery”帖子:

https://medium.com/google-cloud/bigquery-lazy-data-loading-ddl-dml-partitions-and-half-a-trillion-wikipedia-pageviews-cd3eacd657b6

诀窍是设置 BigQuery 以将 GCS 文件视为具有稀有字符分隔符的联合 CSV 文件。然后,您可以在 BigQuery 本身内进行任何转换。

就我而言:

#standardSQL
CREATE VIEW `fh-bigquery.views.wikipedia_views_test_ddl`
AS SELECT
  PARSE_TIMESTAMP('%Y%m%d-%H%M%S', REGEXP_EXTRACT(_FILE_NAME, '[0-9]+-[0-9]+')) datehour
  , REGEXP_EXTRACT(line, '([^ ]*) ') wiki
  , REGEXP_EXTRACT(line, '[^ ]* (.*) [0-9]+ [0-9]+') title
  , CAST(REGEXP_EXTRACT(line, ' ([0-9]+) [0-9]+$') AS INT64) views
  , CAST(REGEXP_EXTRACT(line, ' ([0-9]+)$') AS INT64) zero
  , _FILE_NAME filename
  , line
FROM `fh-bigquery.views.wikipedia_views_gcs`WHERE REGEXP_EXTRACT(line, ' ([0-9]+) [0-9]+$') IS NOT NULL # views
AND REGEXP_EXTRACT(line, ' ([0-9]+)$') = '0' # zero

您可以使用JSON_EXTRACT/JSON_EXTRACT_SCALAR 代替REGEXP_EXTRACT,或者-为了最大的灵活性-javascript UDF。

【讨论】:

以上是关于使用现有 JSON 文件,如何将此数据上传到 BigQuery 并使用 JSON 文件中的数据计算新字段?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Retrofit 将文件上传到服务器,其中内容包含在 JSON 中

如何通过 python 将 JSON 数据附加到存储在 Azure blob 存储中的现有 JSON 文件?

在 Django 中上传 XML 文件,解析 XML 并与现有模型数据集进行比较

从 json 文件流上传批量数据时,最后一批永远不会上传到 Solr

如何防止在 Python 中使用 FTPLIB 覆盖现有文件?

如何将此json数组保存到MYSQL数据库