在 Google Dataprep 中将字符串转换为数组

Posted

技术标签:

【中文标题】在 Google Dataprep 中将字符串转换为数组【英文标题】:Convert a string to an array in Google Dataprep 【发布时间】:2020-05-18 22:55:54 【问题描述】:

我正在尝试对 Dataprep 中的数据进行非规范化处理,以便可以在 BigQuery 中使用它。

更具体地说,我想将使用外键“account_id”链接到我的帐户表的 account_profile 表中的条目转换为我的帐户表中的数组。 (Account_profile 存储联系方式...坏名声,我知道。)

在数据准备中,我已经

    将 account_profile 中的行转换为 json 对象, 然后通过account_id将两个表加入, 然后按 account_id 对行进行分组,并使用聚合函数 LIST 将所有对象转换为对象数组。

问题是,当我尝试在 BigQuery 中取消嵌套该列,或在 BigQuery 中执行任何其他类似数组的操作时,我收到如下错误:“UNNEST 中引用的值必须是数组。”

我的数据看起来不错。例如,这里是一行。

["profile_identifier":"ttcuongem+29@gmail.com","verification_code":"abc789","enabled":true,"id1":2818,"profile_identifier":"xyz123,"enabled ":false,"id1":2874]

我找不到让 BigQuery 将其视为数组的方法,也找不到让 Dataprep 将此类数据创建为数组而不是字符串的方法。人们发布的唯一解决方案是非常具体的技巧,不适用于这种通用案例。

我觉得我正在遵循非规范化最佳实践,并且对 Google ELT 工具链中存在这种差距感到惊讶。我错过了什么?

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

您可以使用最近引入的JSON_EXTRACT_ARRAY 函数,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
SELECT '''[
  "profile_identifier":"ttcuongem+29@gmail.com","verification_code":"abc789","enabled":true,"id1":2818,
  "profile_identifier":"xyz123","enabled":false,"id1":2874
]''' string_col
)
SELECT JSON_EXTRACT_ARRAY(string_col) AS arr_col
FROM `project.dataset.table`   

有输出

Row arr_col
1   "profile_identifier":"ttcuongem+29@gmail.com","verification_code":"abc789","enabled":true,"id1":2818   
    "profile_identifier":"xyz123","enabled":false,"id1":2874

【讨论】:

米哈伊尔,谢谢!我运行了您的示例,这似乎可以解决问题。我看错了地方,因为我专注于数组外部结构而不是其中的 json。我即将在真实的东西上尝试这种技术,并会告诉你它是怎么回事。

以上是关于在 Google Dataprep 中将字符串转换为数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google 表格中将日期转换为字符串

在 Google BigQuery 中将数组转换为字符串 [重复]

导出的数据流模板参数未知

BigQuery / DataPrep:提取字数的有效方法;将 HTML 转换为纯文本

如何在 Google Apps 脚本中将 BigQuery TIMESTAMP 转换为日期?

在 Android 中将字符串转换为 Uri