2016-09-24 5 views
1

Я изучаю возможность использования BigQuery для хранения данных датчиков во временных рядах. Цель состоит в том, чтобы хранить данные в BQ и обрабатывать их в Pandas ... пока что так хорошо ... Pandas может интерпретировать индекс поля TIMESTAMP и создавать серию.Проект схемы BigQuery для произвольных тегов

Дополнительным требованием является то, что данные поддерживают произвольные теги в виде пар ключ/значение (например, job_id = 1234, task_id = 5678). BigQuery может поддерживать это красиво с повторяющимися полями типа RECORD:

    {'fields': 
         [ 
          { 
           "mode": "NULLABLE", 
           "name": "timestamp", 
           "type": "TIMESTAMP" 
          }, 
          { 
           "mode": "REPEATED", 
           "name": "tag", 
           "type": "RECORD", 
           "fields": 
           [ 
            { 
             "name":"name", 
             "type":"STRING" 
            }, 
            { 
             "name":"value", 
             "type":"STRING" 
            }, 
            { 
             "mode": "NULLABLE", 
             "name": "measurement_1", 
             "type": "FLOAT" 
            }, 
            { 
             "mode": "NULLABLE", 
             "name": "measurement_2", 
             "type": "FLOAT" 
            }, 
            { 
             "mode": "NULLABLE", 
             "name": "measurement_3", 
             "type": "FLOAT" 
            }, 
           ] 
          }, 
         ] 
        } 

Это прекрасно работает для хранения данные и даже отлично работает для запроса, если мне нужно только для фильтрации комбинации с одним ключ/значение

SELECT measurement_1 FROM measurements 
WHERE tag.name = 'job_id' AND tag.value = '1234' 

Однако мне также нужно иметь возможность комбинировать наборы тегов в выражениях запроса, и я не могу заставить эту работу работать. Например, этот запрос не возвращает результат

SELECT measurement_1 FROM measurements 
WHERE tag.name = 'job_id' AND tag.value = '1234' 
     AND tag.name = 'task_id' AND tag.value = '5678' 

Вопросы: Можно ли сформулировать запрос, чтобы сделать то, что я хочу с помощью этой схемы? Каков рекомендуемый способ привязать этот тип данных переменных к другой фиксированной схеме в Big Query?

Благодарим за помощь или предложение!

Примечание. Если вы думаете, что это похоже на большое исправление для InfluxDB, это потому, что я до сих пор использую это. По-видимому, непреодолимой проблемой является количество серийной мощности в моем наборе данных, поэтому я ищу альтернативы.

+0

Зачем нужно указывать python, pandas и временные ряды? – Kartik

+0

Важно, что вы можете отметить принятый ответ, используя отметку слева от опубликованного ответа ниже голосования. см. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235, почему это важно. Также важно проголосовать за ответ. Голосовые ответы полезны. Есть еще ... Вы можете проверить, что делать, когда кто-то отвечает на ваш вопрос - http://stackoverflow.com/help/someone-answers. –

ответ

1

BigQuery Наследие SQL

SELECT measurement_1 FROM measurements 
OMIT RECORD IF 
    SUM((tag.name = 'job_id' AND tag.value = '1234') 
    OR (tag.name = 'task_id' AND tag.value = '5678')) < 2 

BigQuery Стандартный SQL

SELECT measurement_1 FROM measurements 
WHERE (
    SELECT COUNT(1) FROM UNNEST(tag) 
    WHERE ((name = 'job_id' AND value = '1234') 
     OR (name = 'task_id' AND value = '5678')) 
) >= 2 
0

Повторные являются отличным способом для хранения серий данных, сбор и т.д.
Для того, чтобы отфильтровать из повторяющихся полей только значение один интерес Я бы использовал следующий шаблон

SELECT 
    MAX(IF(filter criteria, value_to_pull, null)) WITHIN RECORD AS some_name 
FROM <table> 

В вашем случае это должно быть:

SELECT 
    MAX(IF(tag.name = 'job_id' AND tag.value = '1234', measurement_1, NULL)) WITHIN RECORD AS job_1234_meassurement_1, 
    MAX(IF(tag.name = 'task_id' AND tag.value = '5678', measurement_1, NULL)) WITHIN RECORD AS task_5678_meassurement_1, 
    FROM measurements 
Смежные вопросы