Google bigquery Bigquery:将SPLIT()输出行分解为多列

Google bigquery Bigquery:将SPLIT()输出行分解为多列,google-bigquery,Google Bigquery,我在一列中有一个长字符串,需要将其分解为多行,然后拆分为多列。数据如下所示:((a:10,b:20,c:test1)(a:40,b:50,c:test2)(a:60,b:70,c:test3))。当我应用split和regexp_replace时,得到的结果如下 从[mydataset.mytable]中选择SPLIT(REGEXP_REPLACE(REGEXP_REPLACE(message,r'))'、''、r'(('、''))('))作为消息 输出: 味精 a:10,b:20,c:test

我在一列中有一个长字符串,需要将其分解为多行,然后拆分为多列。数据如下所示:((a:10,b:20,c:test1)(a:40,b:50,c:test2)(a:60,b:70,c:test3))。当我应用split和regexp_replace时,得到的结果如下

从[mydataset.mytable]中选择SPLIT(REGEXP_REPLACE(REGEXP_REPLACE(message,r'))'、''、r'(('、''))('))作为消息

输出: 味精
a:10,b:20,c:test1
a:40,b:50,c:test2
a:60,b:70,c:test3

我要找的是:
a b c
10 20测试1
40 50测试2
60 70测试3

我再次使用split按(,)分割行,但它只给我一行,而不是3行。非常感谢您的帮助。

试试下面的例子

SELECT
  MIN(CASE WHEN name = 'a' THEN value END) AS a,
  MIN(CASE WHEN name = 'b' THEN value END) AS b,
  MIN(CASE WHEN name = 'c' THEN value END) AS c
FROM (
  SELECT
    message, msg, 
    REGEXP_EXTRACT(pair, r'(\w*):') AS name, 
    REGEXP_EXTRACT(pair, r':(\w*)') AS value
  FROM (
    SELECT message, msg, 
      SPLIT(msg) AS pair
    FROM (
      SELECT message, 
        SPLIT(REPLACE(REPLACE(message, '))',''), '((','') ,')(') AS msg
      FROM 
        (SELECT '((a:10,b:20,c:test1)(a:40,b:50,c:test2)(a:60,b:70,c:test3))' AS message),
        (SELECT '((a:12,b:22,c:test4)(a:42,b:52,c:test5)(a:62,b:72,c:test6))' AS message),
    )
  )
) 
GROUP BY message, msg
试试下面的例子

SELECT
  MIN(CASE WHEN name = 'a' THEN value END) AS a,
  MIN(CASE WHEN name = 'b' THEN value END) AS b,
  MIN(CASE WHEN name = 'c' THEN value END) AS c
FROM (
  SELECT
    message, msg, 
    REGEXP_EXTRACT(pair, r'(\w*):') AS name, 
    REGEXP_EXTRACT(pair, r':(\w*)') AS value
  FROM (
    SELECT message, msg, 
      SPLIT(msg) AS pair
    FROM (
      SELECT message, 
        SPLIT(REPLACE(REPLACE(message, '))',''), '((','') ,')(') AS msg
      FROM 
        (SELECT '((a:10,b:20,c:test1)(a:40,b:50,c:test2)(a:60,b:70,c:test3))' AS message),
        (SELECT '((a:12,b:22,c:test4)(a:42,b:52,c:test5)(a:62,b:72,c:test6))' AS message),
    )
  )
) 
GROUP BY message, msg

这里有一个替代解决方案,使用(取消选中“显示选项”下的“使用旧SQL”框),该解决方案仍然比较详细,但需要较少的文本操作:

WITH MyTable AS (
  SELECT messages
  FROM UNNEST(['((a:10,b:20,c:test1)(a:40,b:50,c:test2)(a:60,b:70,c:test3))',
               '((a:12,b:22,c:test4)(a:42,b:52,c:test5)(a:62,b:72,c:test6))'])
    AS messages)
SELECT
  (SELECT value FROM UNNEST(message_parts) WHERE name = 'a') AS a,
  (SELECT value FROM UNNEST(message_parts) WHERE name = 'b') AS b,
  (SELECT value FROM UNNEST(message_parts) WHERE name = 'c') AS c
FROM (
  SELECT ARRAY(SELECT AS STRUCT
                 SPLIT(part, ':')[OFFSET(0)] AS name,
                 SPLIT(part, ':')[OFFSET(1)] AS value
               FROM UNNEST(SPLIT(message, ',')) AS part) AS message_parts
  FROM (SELECT message FROM MyTable,
          UNNEST(REGEXP_EXTRACT_ALL(messages, r'\(([^\(\)]+)\)')) AS message)
);

这里有一个替代解决方案,使用(取消选中“显示选项”下的“使用旧SQL”框),该解决方案仍然比较详细,但需要较少的文本操作:

WITH MyTable AS (
  SELECT messages
  FROM UNNEST(['((a:10,b:20,c:test1)(a:40,b:50,c:test2)(a:60,b:70,c:test3))',
               '((a:12,b:22,c:test4)(a:42,b:52,c:test5)(a:62,b:72,c:test6))'])
    AS messages)
SELECT
  (SELECT value FROM UNNEST(message_parts) WHERE name = 'a') AS a,
  (SELECT value FROM UNNEST(message_parts) WHERE name = 'b') AS b,
  (SELECT value FROM UNNEST(message_parts) WHERE name = 'c') AS c
FROM (
  SELECT ARRAY(SELECT AS STRUCT
                 SPLIT(part, ':')[OFFSET(0)] AS name,
                 SPLIT(part, ':')[OFFSET(1)] AS value
               FROM UNNEST(SPLIT(message, ',')) AS part) AS message_parts
  FROM (SELECT message FROM MyTable,
          UNNEST(REGEXP_EXTRACT_ALL(messages, r'\(([^\(\)]+)\)')) AS message)
);

实际数据是长字符串,大约分为40行,行数不固定。实际数据是长字符串,大约分为40行,行数不固定。非常感谢Mikhail,此解决方案对我有效:)太好了,你可以考虑接受它:o)你可以在投票的下方用记号左边的记号写<代码>标记接受答案< /代码>。看看为什么它很重要!非常感谢米哈伊尔,这个解决方案对我来说很有用:“好的,你可以考虑接受它:O,你可以通过使用在投票下面的答案的左边的记号写<代码>标记接受的答案< /代码>。看看为什么它很重要!我希望BigQuery标准SQL文档能够和您最近的相关答案一样好!我真的很喜欢这些例子!谢谢你,艾略特!!是的,没问题!您似乎也很快就了解了标准SQL:)我们将继续改进文档,因为我们正在向公共测试版迈进。我在这个答案中看到的唯一问题是,初始数据没有问题!如果您重写它来处理非常初始的数据,那就太好了。我想你最终会有更沉重的额外转变。因此,在我看来,在这种情况下,标准sql“需要更少的文本操作”是适用的,或者至少不是那么明显。我觉得有更好的方法用标准sql实现。只是感觉:哦,哎呀,再试一次;我已经解决了这个问题的一个简单版本。遗留的BigQuery SQL和标准SQL解决方案都比较冗长;)非常感谢艾略特的帮助。解决方案运行良好,唯一的问题是我需要在标准SQL中运行它。我希望BigQuery标准SQL文档将和您最近的相关答案一样好!我真的很喜欢这些例子!谢谢你,艾略特!!是的,没问题!您似乎也很快就了解了标准SQL:)我们将继续改进文档,因为我们正在向公共测试版迈进。我在这个答案中看到的唯一问题是,初始数据没有问题!如果您重写它来处理非常初始的数据,那就太好了。我想你最终会有更沉重的额外转变。因此,在我看来,在这种情况下,标准sql“需要更少的文本操作”是适用的,或者至少不是那么明显。我觉得有更好的方法用标准sql实现。只是感觉:哦,哎呀,再试一次;我已经解决了这个问题的一个简单版本。遗留的BigQuery SQL和标准SQL解决方案都比较冗长;)非常感谢艾略特的帮助。解决方案运行良好,唯一的问题是我需要在标准SQL中运行它。