从对象数组中获取数据 sql BigQuery

Posted

技术标签:

【中文标题】从对象数组中获取数据 sql BigQuery【英文标题】:fetch the data from array of objects sql BigQuery 【发布时间】:2020-10-13 14:12:00 【问题描述】:

我需要从数组中的第二个对象中获取键值对。此外,需要使用获取的数据创建新列。我只对第二个对象感兴趣,有些数组有 3 个对象,有些有 4 个等等。数据如下所示:

['adUnitCode': ca-pub, 'id': 35, 'name': ca-pub, 'adUnitCode': hmies, 'id': 49, 'name': HMIES, 'adUnitCode': moda, 'id': 50, 'name': moda, 'adUnitCode': nova, 'id': 55, 'name': nova, 'adUnitCode': listicle, 'id': 11, 'name': listicle]
['adUnitCode': ca-pub, 'id': 35, 'name': ca-pub-73, 'adUnitCode': hmiuk-jam, 'id': 23, 'name': HM, 'adUnitCode': recipes, 'id': 26, 'name': recipes]
['adUnitCode': ca-pub, 'id': 35, 'name': ca-pub-733450927, 'adUnitCode': digital, 'id': 48, 'name': Digital, 'adUnitCode': movies, 'id': 50, 'name': movies, 'adUnitCode': cannes-film-festival, 'id': 57, 'name': cannes-film-festival, 'adUnitCode': article, 'id': 57, 'name': article]

想要的输出:

adUnitCode           id             name 
hmies                49             HMIES
hmiuk-jam            23             HM
digital              48             Digital

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
select 
  json_extract_scalar(second_object, "$.adUnitCode") as adUnitCode,
  json_extract_scalar(second_object, "$.id") as id,
  json_extract_scalar(second_object, "$.name") as name
from `project.dataset.table`, unnest(
  [json_extract_array(regexp_replace(mapping, r"(: )([\w-]+)(,|)", "\\1'\\2'\\3"))[safe_offset(1)]]
) as second_object

如果应用于您问题的样本数据 - 输出是

如您所见,这里的“技巧”是在 regexp_replace 函数中使用正确的正则表达式。我现在已经包含了任何字母字符和 - 。您可以根据需要添加更多内容 作为替代方案,您可以尝试regexp_replace(mapping, r"(: )([^,]+)", "\\1'\\2'"),如下例所示 - 因此您可能会覆盖更多案例而无需更改代码

#standardSQL
select 
  json_extract_scalar(second_object, "$.adUnitCode") as adUnitCode,
  json_extract_scalar(second_object, "$.id") as id,
  json_extract_scalar(second_object, "$.name") as name
from `project.dataset.table`, unnest(
  [json_extract_array(regexp_replace(mapping, r"(: )([^,]+)", "\\1'\\2'"))[safe_offset(1)]]
) as second_object

【讨论】:

你是一个sql魔术师!第二种方法适用于我的问题。非常感谢你!接受答案并投票。 很高兴它有帮助 :o) @MikhailBerlyant 谢谢你的回答。有什么方法可以不仅针对第二个对象,而且针对每个对象? @Arsik36 - 在 cmets 内无法回答这个问题。如果您有任何问题 - 请附上所有具体细节,我很乐意回答:o)同时,如果上述答案对您有用 - 考虑投票:o) 谢谢你,@MikhailBerlyant,一旦我完成了这个问题,我现在会发布我的问题

以上是关于从对象数组中获取数据 sql BigQuery的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 中未嵌套的 json 对象的字符串化数组

在 sql google BigQuery 中访问数组

Bigquery 为其余数据输出带有 json 数组对象的不同 zip 行

BigQuery:使用 SQL 从辅助表中查找 ID 数组并连接数据

BigQuery 从 sql 数据的 json 导出加载数据

在 bigquery UDF 中使用 SQL