Google bigQuery拆分列

时间:2017-01-22 06:49:00

标签: python sql sqlite google-bigquery

我使用谷歌bigQuery来分析亚马逊书评数据集。数据集有一个“有用”的数据集。列看起来像这样:'有用' :[0,0]其中第一个元素是“是”'投票,第二个是'总计'投票。

当我上传bigQuery数据时,它将列拆分为两行,因为它不支持数组格式。 bigQuery screenshot。 使用'申请系列' python pandas中的方法我可以将有用的列拆分为两列 - '有用的投票'和'总投票': jupyter notebook screenshot

如果我写这个查询在BQ中做同样的事情:

SELECT TA1.reviewerID, TA1.helpful AS yes, TA2.helpful AS total
FROM table_name as TA1

LEFT JOIN table_name as TA2
ON TA1.reviewerID = TA2.reviewerID and TA2.helpful != TA1.helpful
GROUP BY TA1.reviewerID

我收到以下错误: 错误:(L1:27):表达' TA1.helpful'在GROUP BY列表中不存在。

同样的查询在我的sqlite3中有效。我在BQ做错了什么?

谢谢,

1 个答案:

答案 0 :(得分:2)

以下是BigQuery Standard SQL

#standardSQL
SELECT 
  reviewerID, 
  helpful[OFFSET(0)] AS helpfulVote, 
  helpful[OFFSET(1)] AS totalVote 
FROM table_name  

您可以使用虚拟数据进行测试,如下所示

#standardSQL
WITH table_name AS (
  SELECT 'A' AS reviewerID, [0,0] AS helpful UNION ALL
  SELECT 'B' AS reviewerID, [0,2] AS helpful
)
SELECT 
  reviewerID, 
  helpful[OFFSET(0)] AS helpfulVote, 
  helpful[OFFSET(1)] AS totalVote 
FROM table_name 

查看Accessing Array Elements

的详情

如果由于某种原因您仍在使用BigQuery Legacy SQL,您可以使用以下版本(同时请参阅标准SQL的Migrating from legacy SQL,因为这是首选版本)

#legacydSQL
SELECT 
  reviewerID,
  MIN(helpful) WITHIN RECORD AS helpfulVote,
  MAX(helpful) WITHIN RECORD AS totalVote
FROM table_name  
  

同样的查询在我的sqlite3中有效。我在BQ做错了什么?

最后,如果您希望原始查询有效/固定 - 请参阅下文并详细了解GROUP BY如何运作

#legacydSQL
SELECT 
  TA1.reviewerID as reviewerID, 
  MIN(TA1.helpful) AS yes, 
  MAX(TA2.helpful) AS total
FROM table_name   as TA1
LEFT JOIN table_name   as TA2
ON TA1.reviewerID = TA2.reviewerID -- and TA2.helpful != TA1.helpful
GROUP BY TA1.reviewerID