将数组文件加载到大查询

Posted

技术标签:

【中文标题】将数组文件加载到大查询【英文标题】:Load array file to Big query 【发布时间】:2020-11-27 13:22:10 【问题描述】:

我正在寻找将以下数组上传到大查询表的有效方法 采用这种格式:

大查询列(示例)

event_type: video_screen
event_label: click_on_screen
is_ready:false
time:202011231958
long:1
high:43
lenght:0

**

数组对象

**

[["video_screen","click_on_screen","false","202011231958","1","43","0"],["buy","error","2","202011231807","1","6","0"],["sign_in","enter","user_details","202011231220","2","4","0"]]

我想了几个选项,但似乎都不是最佳做法。

选项 A:将以下文件上传到 Google 存储,然后创建与此存储桶相关的表 - 由于文件格式问题,Google Bigquery 无法解析来自 Google 存储桶的数组。

选项 B:后端 (node.js) 使用将文件结构更改为 CSV 并将其直接上传到 Bigquery - 由于延迟而失败(数组很长,比我的示例多)。

选项 C:使用 Google Appcript 获取数组对象并将其插入 Bigquery - 我没有找到简单的代码,Google 存储没有连接到 Appscript 的 API。

有人处理过这种情况并可以分享他的解决方案吗?这种情况下的最佳做法是什么?如果你有这方面的代码,那就太好了。

【问题讨论】:

选项 D,直接将文件写入 csv 或其他支持的格式。然后您可以轻松地将行插入 BQ 文件中最长的行是多少? 每个文件 100K 行,但我每 5 分钟处理多个文件。 每个文件的行数没有问题。您的文件中最长的行是什么? 1单行多长? 6 列,最多 10 个。 【参考方案1】:

将文件从 GCS 加载到 BigQuery 到具有 1 个单一 string 列的表中。所以你得到了 100K 行和一列。

基本上,您将拥有一个在字符串中包含 JSON 的表。

使用JSON_EXTRACT_ARRAY将JSON数组处理成elements

然后稍后将每个位置提取到其对应的变量/列中并将其写入表

这是一个演示:

with t as (
    select '[["video_screen","click_on_screen","false","202011231958","1","43","0"],["buy","error","2","202011231807","1","6","0"],["sign_in","enter","user_details","202011231220","2","4","0"]]' as s
),
elements as (
select e from t,unnest(JSON_EXTRACT_ARRAY(t.s)) e
)
select 
    json_extract_scalar(e,'$[0]') as event_type ,
    json_extract_scalar(e,'$[1]') as event_label,
from elements

输出是:

【讨论】:

听起来不错,但是,如何将文件从 GCS 加载到 BigQuery 到具有 1 个单字符串列和 100K 行的表中? BigQuery 无法解析此类文件 [[1,2,3],[1,2,3]] @idan 以 CSV 格式加载,并指定行中不存在的分隔符,例如 TAB 或 ~ 或 ^。这样您就可以将整行加载为 1 列。 所有文件都输入到一个单元格中,如何创建一个单独的单元格? 这意味着您的所有输入都在一行上。如果在一个单元格中输入文件,这不是问题。这正是您所需要的。现在用我的例子来爆炸吧。 我不确定这样做是否正确,所有数据都将输入到一个单元格中?没有限制?字符串限制?

以上是关于将数组文件加载到大查询的主要内容,如果未能解决你的问题,请参考以下文章

使用命令行将 csv 文件加载到大查询中时面临问题

将云存储中的文本文件 (.txt) 加载到大查询表中

使用云功能将数据加载到大查询表中,它是附加到表中的,我需要它来替换

如何在不创建架构的情况下将 CSV 文件加载到 BigQuery

将原始“事件”数据从 Firebase 导出到大查询?

无法将 csv 文件从 GCS 加载到 bigquery