2015-11-23 3 views
0

Я пытаюсь запросить данные резервного хранилища данных приложения-движка. В Python сущности описываются как-то вроде этого:Как сгладить запись большого запроса с несколькими повторяющимися полями?

class Bar(ndb.Model): 
    property1 = ndb.StringProperty() 
    property2 = ndb.StringProperty() 

class Foo(ndb.Model): 
    bar = ndb.StructuredProperty(Bar, repeated=True) 
    baz = ndb.StringProperty() 

К сожалению, когда Foo получает backed up and loaded into bigquery, схема таблицы которая загружается как:

bar    | RECORD | NULLABLE 
bar.property1 | STRING | REPEATED 
bar.property2 | STRING | REPEATED 
baz    | STRING | NULLABLE 

То, что я хотел бы сделать, это получить таблицу из всех bar.property1 и связанных с ними bar.property2, где baz = 'baz'.

Есть ли простой способ сгладить Foo, чтобы записи в баре были «застегнуты» вместе? Если это невозможно, есть ли другое решение?

ответ

2

Как указывалось в комментарии по @Mosha, кажется, что большой запрос поддерживает определенные пользователем функции (UDF). Вы можете ввести его на вкладке UDF Editor в веб-интерфейсе. В этом случае, я использовал что-то вроде:

function flattenTogether(row, emit) { 
    if (row.bar && row.bar.property1) { 
    for (var i=0; i < row.bar.property1.length; i++) { 
     emit({property1: row.bar.property1[i], 
      name: row.bar.property2[i]}); 
    } 
    } 
}; 

bigquery.defineFunction(
    'flattenBar', 
    ['bar.property1', 'bar.property2'], 
    [{'name': 'property1', 'type': 'string'}, 
    {'name': 'property2', 'type': 'string'}], 
    flattenTogether); 

И тогда запрос выглядел так:

SELECT 
    property1, 
    property2, 
FROM 
    flattenBar(
    SELECT 
    bar.property1, 
    bar.property2, 
    FROM 
    [dataset.foo] 
    WHERE 
    baz = 'baz') 
1

Поскольку Баз не повторяется, вы можете просто фильтр на нем в ИНЕКЕ без уплощения:

SELECT bar.property1, bar.property2 FROM t WHERE baz = 'baz' 
+0

Я получаю 'Ошибка: Не удается вывести несколько независимо повторяющиеся поля в то же time.' – mgilson

+0

вы могли бы установить опция запроса «Свести результаты» на значение false –

+0

Не за исключением установки выходной таблицы (по крайней мере, не в веб-интерфейсе) - что не очень желательно для специальных запросов по данным. – mgilson

Смежные вопросы