更新 BigQuery 表中的嵌套字段
Posted
技术标签:
【中文标题】更新 BigQuery 表中的嵌套字段【英文标题】:Update nested field in BigQuery table 【发布时间】:2017-07-06 15:36:37 【问题描述】:我正在尝试执行您认为在 BigQuery 中微不足道的操作;我正在尝试更新 BigQuery 表中作为 360 导出结果的嵌套字段。
这是我的查询:
#standardSQL
UPDATE `dataset_name`.`ga_sessions_20170705`
SET hits.eventInfo.eventLabel = 'some string'
WHERE TRUE
但我收到此错误消息:
Error: Cannot access field eventInfo on a value with type ARRAY<STRUCT<item STRUCT<transactionId INT64, currencyCode STRING>, isEntrance BOOL, minute INT64, ...>> at [3:10]
如何更新这个嵌套字段?
【问题讨论】:
【参考方案1】:hits
是一个数组,所以需要使用数组子查询来赋值。它看起来像这样:
#standardSQL
UPDATE `dataset_name`.`ga_sessions_20170705`
SET hits =
ARRAY(
SELECT AS STRUCT * REPLACE(
(SELECT AS STRUCT eventInfo.* REPLACE('some string' AS eventLabel)) AS eventInfo)
FROM UNNEST(hits)
)
WHERE TRUE;
【讨论】:
感谢@Elliot 的超快速回复!运行您的查询时出现此错误:ARRAY subquery cannot have more than one column unless using SELECT AS STRUCT to build STRUCT values at [4:3]
。不幸的是,这对我来说有点神秘,因为我对 BigQuery 还很陌生。
啊,我忘了SELECT AS STRUCT
。现在可以了吗?
嗯,现在错误显示为Error: Value of type ARRAY<STRUCT<item STRUCT<transactionId INT64, currencyCode STRING>, isEntrance BOOL, minute INT64, ...>> cannot be assigned to hits, which has type ARRAY<STRUCT<item STRUCT<transactionId INT64, currencyCode STRING>, isEntrance BOOL, minute INT64, ...>> at [4:3]
再试一次...我没有一个表来运行查询,所以我把这个写在我的脑海里。我想我需要使用 REPLACE 来保留结构字段顺序。【参考方案2】:
如果您需要修改给定的自定义维度,您可以使用:
#standardSQL
UPDATE `tablename`
SET hits =
ARRAY(
SELECT AS STRUCT * REPLACE(
ARRAY(
SELECT AS STRUCT cd.index,
CASE WHEN cd.index = index_number THEN 'new value'
ELSE cd.value
END
FROM UNNEST(customDimensions) AS cd
) AS customDimensions)
FROM UNNEST(hits) hit
)
WHERE TRUE
但是运行需要一段时间。
【讨论】:
感谢@María García Gumbao 这个例子帮助了我。但我的是用于搜索 PII 数据的点击页面,下面是我的查询。【参考方案3】:这是在有电子邮件的 ga 会话中屏蔽 PII 数据
UPDATE
`<project-id>.<dataset-name>.<table-name>`
SET hits =
ARRAY(SELECT AS STRUCT * REPLACE (
-- correcting pages here
IF(REGEXP_CONTAINS(page.pagePath, r"@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+")
,STRUCT(
REGEXP_REPLACE(page.pagePath, r"@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+", "[EMAIL]")
,page.pagePathLevel1
,page.pagePathLevel2
,page.pagePathLevel3
,page.pagePathLevel4
,page.hostname
,page.pageTitle
,page.searchKeyword
,page.searchCategory
), page) AS page)
FROM UNNEST(hits)
)
WHERE ( -- only relevant sessions
SELECT COUNT(1) > 0
FROM UNNEST(hits) AS hits
WHERE totals.visits = 1
AND hits.type = 'PAGE'
AND REGEXP_CONTAINS(hits.page.pagePath, r"@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+") = true
)
【讨论】:
以上是关于更新 BigQuery 表中的嵌套字段的主要内容,如果未能解决你的问题,请参考以下文章