Bigquery 函数中是不是有等效的 pandas split(expand=True) ?

Posted

技术标签:

【中文标题】Bigquery 函数中是不是有等效的 pandas split(expand=True) ?【英文标题】:Is there a pandas split(expand=True) equivalent in Bigquery function?Bigquery 函数中是否有等效的 pandas split(expand=True) ? 【发布时间】:2021-10-22 12:18:16 【问题描述】:

我正在尝试在 BigQuery 中重现以下示例:

从表格开始:

ROW                                    VALUE
0                                        AAA
1                                        BBB
2                                     CCC ~ DDD

我想在 BigQuery 中重现以下行为:

df["VALUE"].str.split("~",expand=True)

返回:

       0             1            
0     AAA          None         
1     BBB          None         
2     CCC          DDD

有没有办法在 BigQuery 中实现这一点?

到目前为止,我有以下查询:

SELECT SPLIT(VALUE, "~")
FROM my_dataset.my_table

但它会返回:

Row     f0_     
1   683600749R
    ______________
2   284A92167R
    ______________
3   281150577R 
    
    281154695R
    ______________

虽然我想拥有:

Row     f0_           f1_
1   683600749R      None
    ____________________________
2   284A92167R      None
    ____________________________
3   281150577R      281154695R
    ____________________________

【问题讨论】:

【参考方案1】:

这不是一个完美的解决方案,但要获得拆分的第 1 部分和第 2 部分,您可以编写:

with tab1 as (
    SELECT NULL as col1
        UNION ALL
    SELECT 'AAA' as col1
        UNION ALL 
    SELECT 'BBB' as col1
        UNION ALL 
    SELECT 'CCC ~ DDD'as col1
)
SELECT 
col1,
SPLIT(col1, "~")[OFFSET(0)] AS part_1,
CASE 
    WHEN ARRAY_LENGTH(SPLIT(col1, "~")) < 2 THEN NULL 
    ELSE SPLIT(col1, "~")[OFFSET(1)] 
    END AS part_2
FROM tab1

# output
Row    col1     part_1    part_2
1    null    null    null
2    AAAA    AAAA    null
3    BBBB    BBBB    null
4    CCC ~ DDDD    CCC    DDD

如果您不使用 CASE WHEN 来获取 OFFSET(1),当 SPLIT 不会(至少)生成两个部分时,您将收到错误 Array index 1 is out of bounds

【讨论】:

以上是关于Bigquery 函数中是不是有等效的 pandas split(expand=True) ?的主要内容,如果未能解决你的问题,请参考以下文章

PySpark 中是不是有与 Pandas 聚合函数 any() 等效的函数?

pandas 中是不是有与 excel 中的 MATCH 函数等效的函数?

BigQuery:标准 SQL 中的 PI()

CONCAT_WS 的 BigQuery 等效项

BigQuery 将列作为逗号分隔值

Bigquery Standard Sql 等效于 Legacy Sql 中的 GROUP_CONCAT_UNQUOTED