Google bigquery BigQuery SPLIT()忽略空值

Google bigquery BigQuery SPLIT()忽略空值,google-bigquery,Google Bigquery,似乎SPLIT()将空值视为根本不存在,这会产生意外的结果 例如: SELECT NTH(3, SPLIT(values, ",")) FROM (SELECT "a,b,,d,e" as values) 返回“d”,而我希望它返回NULL。您可以看到,对于几行逗号分隔的文本,这将是多么有问题。可以预期以下查询将返回NULL和“c”,但实际情况并非如此: SELECT NTH(3, SPLIT(values, ",")) FROM (SELECT "a,b,,d,e" as v

似乎SPLIT()将空值视为根本不存在,这会产生意外的结果

例如:

SELECT
  NTH(3, SPLIT(values, ","))
FROM
  (SELECT "a,b,,d,e" as values)
返回“d”,而我希望它返回NULL。您可以看到,对于几行逗号分隔的文本,这将是多么有问题。可以预期以下查询将返回NULL和“c”,但实际情况并非如此:

SELECT
  NTH(3, SPLIT(values, ","))
FROM
  (SELECT "a,b,,d,e" as values),
  (SELECT "a,,c,d,e" as values)
相反,它返回“d”和“d”


这是设计的行为,可以改变吗,或者有更好的方法来完成我正在做的事情吗?

这是设计的行为,它不是特定于拆分函数,而是一般的重复字段。BigQuery重复字段不能存储空值(与协议缓冲区中的行为相同),因此SPLIT所做的任何操作都不能使空值出现在重复字段中。

正如Mosha所解释的,从SPLIT()操作中获取空值是不可能的。作为一种选择,是否可以获得空空间

SELECT
  NTH(7, SPLIT(values, ","))
FROM
(SELECT REGEXP_REPLACE(values, ',,', ', ,') values FROM
  (SELECT "a,b,,d,e,,g" as values),
  (SELECT "a,,c,d,e,f,g" as values),
  (SELECT "a,,c,d,e,f,," as values),
  (SELECT "a,,c,d,e,f," as values),
)

Row f0_  
1   g    
2   g    
3        
4   null    

通常,当我有一个CSV文件并且我想将其导入Google Big Query时,我会将该CSV文件上载到Google cloud storage,为其编写一个模式,然后将其作为一个表导入Google Big Query。您需要SPLIT()的唯一方法是,假设您的JSON数据包含包含CSV数据的字段。话虽如此,我同意这看起来很奇怪。好吧,好的观点——我不记得为什么我开始先加载原始格式的文件,然后使用BQ进行拆分。当我返回并用模式加载CSV时,它工作得很好。谢谢但是,是的,SPLIT()的行为仍然与我预期的不同,所以我稍微改变了这个问题,看看是否有人有想法。是的,这实际上是我使用了一段时间的方法,而且效果很好。但是,当然,在期望有空值的空间中,从来都不是最优的!即将发布:JavaScript UDFs:)