Ниже для стандартного SQL BigQuery
#standardSQL
SELECT hashtag,
STRING_AGG(CONCAT(day, ':', cnt), '|' ORDER BY day) AS timeline
FROM (
SELECT hashtag,
CAST(DATE(created_at) AS STRING) day,
CAST(COUNT(1) AS STRING) cnt
FROM `project.dataset.table`,
UNNEST(REGEXP_EXTRACT_ALL(data, r'"(?:t|d)":(".*?")')) val,
UNNEST(REGEXP_EXTRACT_ALL(val, r'(#.*?)\s')) hashtag
GROUP BY hashtag, day
)
GROUP BY hashtag
Если вам нужно извлечь больше, чем просто свойства t
и d
- вы просто добавляете их в список (?:t|d)
вместо использования несколькихUNION ALL
, если выполнить выше для данных примера в вашем вопросе - результат
Row hashtag timeline
1 #hash1 2018-01-01:4|2018-01-03:1
2 #hash2 2018-01-03:1
Обновление по адресу "глубокая структура", упомянутое в комментарии @ user2576951
См. Ниже обновление вместе с фиктивными данными для проверки с
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, '{"x":"title","t":"#hash1 title","d":"help #hash1 desc"}' data, TIMESTAMP '2018-01-01 10:00:00' created_at UNION ALL
SELECT 2, '{"t":"#hash1 title","y":"title","d":"#hash1 desc"}', '2018-01-01 11:00:00' UNION ALL
SELECT 3, '{"t":"title","d":"#hash1 #hash2 desc","z":"title"}', '2018-01-03 10:00:00' UNION ALL
SELECT 4, '{"t":"title","d":"description","snippet":{"t":"#hash1","st":"#hash1", "ssd":"#hash3"}}', '2018-02-03 10:00:00'
)
SELECT hashtag,
STRING_AGG(CONCAT(day, ':', cnt), '|' ORDER BY day) AS timeline
FROM (
SELECT
hashtag,
CAST(DATE(created_at) AS STRING) day,
CAST(COUNT(1) AS STRING) cnt
FROM `project.dataset.table`,
UNNEST(REGEXP_EXTRACT_ALL(data, r'"(?:t|d|st|sd)":"(.*?)"')) val,
UNNEST(REGEXP_EXTRACT_ALL(val, r'(#.*?)(?:$|\s)')) hashtag
GROUP BY hashtag, day
)
GROUP BY hashtag
-- ORDER BY hashtag
с выводом
Row hashtag timeline
1 #hash1 2018-01-01:4|2018-01-03:1|2018-02-03:2
2 #hash2 2018-01-03:1
, как вы можете видеть здесь, хэштеги собраны из вложенных элементов и "ssd "не было найдено, хотя sd
является его частью
Я думаю, что выше рассматриваются ваши комментарии / проблемы