【问题标题】: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 个。

标签: node.js google-apps-script google-bigquery google-cloud-storage


【解决方案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 列。
  • 所有文件都输入到一个单元格中,如何创建一个单独的单元格?
  • 这意味着您的所有输入都在一行上。如果在一个单元格中输入文件,这不是问题。这正是您所需要的。现在用我的例子来爆炸吧。
  • 我不确定这样做是否正确,所有数据都将输入到一个单元格中?没有限制?字符串限制?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 2014-08-28
相关资源
最近更新 更多