2017-01-22 2 views
2

Я использую google bigQuery для анализа набора данных обзора амазонки. У набора данных есть «полезный» столбец, который выглядит так: «полезно»: [0, 0], где первый элемент является «да», а второй - «полным» голосованием.Google bigQuery split column

Когда я загружаю данные inn bigQuery, он разбивает столбец на две строки, потому что он не поддерживает формат массива. bigQuery screenshot. Используя метод «применить ряд» в питона панд я могу разделить полезную колонку в два columns- «полезный голос» и «общий голос»: 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?

Спасибо,

+0

это кажется как интересный набор данных, вы сможете поделиться? –

+0

@Felipe [ссылка] (http://jmcauley.ucsd.edu/data/amazon/) – biswajit

+0

Спасибо! Теперь, если вы загрузили его в BigQuery и открыли данные, вы можете публиковать этот набор данных. Было бы намного легче ответить на такие вопросы :). https://twitter.com/felipehoffa/status/761635507080081408 –

ответ

2

Ниже для BigQuery стандарта 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 Наследство SQL, вы можете использовать ниже версии (тем временем см Migrating from legacy SQL в стандартный SQL, так как это является предпочтительным вариантом использования)

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

The same query works in my sqlite3. What am I doing wrong in 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