在Google bigquery中转换数据 - 提取文本,将其拆分为多个列并旋转数据

时间:2014-10-09 15:59:23

标签: sql regex bigdata google-bigquery google-cloud-storage

我在大查询中有一些博客数据,我需要进行转换以便于使用和查询。数据如下:

Big_Query_Table

我想在结果{... ..} (蓝色)后提取并转换卷曲括号内的数据。数据的格式为'(\ d +((PQ)|(KL))+ \ d +)',结果数组中可以有1-20个条目。我只对前16个条目感兴趣。

我已经能够使用Substr和regext_extract将卷曲括号内的数据提取到新列中。但我无法将其拆分为列(有时只有1个结果,所以分隔符“,”缺失。我是新的正则表达式,可能是我可以使用像'(\ d +((PQ)| (KL))+ \ d +) {1}'等将数据拆分成多列然后转动它。

在我的情况下,理想的输出是将它转换成类似的东西:

Ouput Table

在上面的解决方案中,原始表中的每一行重复1-16次,具体取决于Results数组中的项目数。

我不确定是否可以在大查询中执行此操作。如果有人能在这里帮助我,我将不胜感激。

如果无法做到这一点,那么对于结果数组中少于16个条目的情况,我可以在Event_details中为每个具有NULL值的事件设置16行。

如果这两个都不可能,最后一个解决方案是将其转换为: back_up_output_table

我想要转换数据的原因是,在大多数情况下,我需要找到哪些结果数组项目出现以及按什么顺序出现。

2 个答案:

答案 0 :(得分:2)

检查出来:Split string into multiple columns with bigquery。 在他们的情况下,它由空格分隔。用','

替换\ s

类似的东西:

SELECT  
Regexp_extract(StringToParse,r'^*{(?:[^,]*,){0}(\d+(?:(?:PQ)|(?:KL))+\d+)\s?') as Word0,
Regexp_extract(StringToParse,r'^*{(?:[^,]*,){1}(\d+(?:(?:PQ)|(?:KL))+\d+)\s?') as Word1,
Regexp_extract(StringToParse,r'^*{(?:[^,]*,){2}(\d+(?:(?:PQ)|(?:KL))+\d+)\s?') as Word2,
Regexp_extract(StringToParse,r'^*{(?:[^,]*,){3}(\d+(?:(?:PQ)|(?:KL))+\d+)\s?') as Word3,
FROM
(SELECT 'bla{1234PQ5,6789KL0,1234PQ5,6789KL0,123' as StringToParse)

答案 1 :(得分:1)

使用SPLIT()

BQ split documentation.

SELECT Event_ID, Event_UserID, Event_SessionID, Keyword,
SPLIT(REGEXP_EXTRACT(Event_details,"Results\{(.*)\}"),",") as Event_details_item
FROM mydata.mytable