将数组文件加载到大查询
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 列。 所有文件都输入到一个单元格中,如何创建一个单独的单元格? 这意味着您的所有输入都在一行上。如果在一个单元格中输入文件,这不是问题。这正是您所需要的。现在用我的例子来爆炸吧。 我不确定这样做是否正确,所有数据都将输入到一个单元格中?没有限制?字符串限制?以上是关于将数组文件加载到大查询的主要内容,如果未能解决你的问题,请参考以下文章
使用云功能将数据加载到大查询表中,它是附加到表中的,我需要它来替换