如何拆分每 6 个字符的列数据并在 BigQuery 中形成一行

Posted

技术标签:

【中文标题】如何拆分每 6 个字符的列数据并在 BigQuery 中形成一行【英文标题】:how to split column data for each 6 chars and to form a rows in BigQuery 【发布时间】:2021-03-18 04:27:41 【问题描述】:

我需要将列数据拆分为每 6 个字符。

Input:
+----+----------------------+
|col1|                  col2|
+----+----------------------+
|d1|X11   F11   1000KG123456|
|d2|X22   F22   3500Kabcdefgh|

Expecting:
+------------+
|col1|col2|
+------------+
|d1|     X11|
|d1|     F11|
|d1|  1000KG|
|d1|  123456|
|d2|     X22|
|d2|     F22|
|d2|  3500Ka|
|d2|  bcdefg|
|d2|       h|

我需要一个通用查询而不是硬编码查询。我的表中有大量数据。 我试过下面的查询它没有用。

with mytable as 
(select col1,col2 from `table_name`)
select col1, c2
from mytable, unnest(SPLIT(col2, '(?<=\\G......)')) as c2

其中 '(?

【问题讨论】:

你知道col2 中最多可以包含多少个字符吗? 截至目前 1146,它也可能有所不同。 您必须在数据库内部进行此清理,还是可以在其他地方进行? 这不是为了任何清理。拆分此表后,我需要加入另一个表,因为它包含 6 个字符作为键。这是为了进一步的功能验证。 是的,它是一种清理,为了得到你想要的规范化表,你需要做一些清理。因此,我上面的问题,你没有回答。 【参考方案1】:

尝试以下查询,它会按预期工作

with mytable as 
(select col1,col2 from `table_name`)
select col1, c2
from mytable, unnest(REGEXP_EXTRACT_ALL(string_field_1, '.6')) as c2

更多详情请参考

https://github.com/google/re2/wiki/Syntax

https://cloud.google.com/bigquery/docs/reference/standard-sql/string_functions#regexp_extract_all

【讨论】:

您好 SANN3,非常感谢您的帮助,您的查询绝对适合我的要求。 @Rajasekhar888 - 不确定您所说的“合适”是什么意思,但它肯定不会返回预期结果 - 行 |d2| h| 丢失。查看我的正确查询答案 实际上我的数据正确拆分以容纳 6 个字符。所以没有发现区别。再次感谢您的回复。【参考方案2】:

考虑下面

select col1, col2
from `project.dataset.table`,
unnest(regexp_extract_all(col2, r'.1,6')) col2    

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

【讨论】:

你有没有机会尝试看看有什么不同?

以上是关于如何拆分每 6 个字符的列数据并在 BigQuery 中形成一行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hive 中将一列拆分为两列

如何将字符串字典转换为字典并拆分为单独的列

拆分2列中的特殊字符并在oracle中合并为多行

将 DataFrame 中的字符串数组拆分为它们自己的列

如何将字符串拆分为视图的列? [复制]

Pyspark - 如何拆分具有 Datetime 类型的结构值的列?