Eu tenho alguns instantâneos de um banco de dados que não são séries temporais. Por exemplo:
Dia da captura instantânea 1:
+----+---------------+------------+------------+ | ID | Title | Category | Date | +----+---------------+------------+------------+ | 1 | My First Post | helloworld | 2015-01-01 | +----+---------------+------------+------------+
Dia da captura instantânea 2 (uma nova postagem foi adicionada hoje):
+----+----------------+------------+------------+ | ID | Title | Category | Date | +----+----------------+------------+------------+ | 1 | My first post | helloworld | 2015-01-01 | | 2 | My second post | other | 2015-01-02 | +----+----------------+------------+------------+
Instantâneo dia 3 (a postagem 2 foi removida hoje):
+----+---------------+------------+------------+ | ID | Title | Category | Date | +----+---------------+------------+------------+ | 1 | My First Post | helloworld | 2015-01-01 | +----+---------------+------------+------------+
Portanto, entre dias, uma linha da tabela pode ou não ser constante. Agora, preciso poder usar uma consulta como esta:
SELECT category, COUNT(*) from day1.My_table group by category
Isto é para uma mesa de um dia. Se quisermos contar a média diária de postagens por categoria em um mês , devemos fazer algo como:
SELECT category, SUM(cnt) / 30
from (
SELECT category, COUNT(*) as cnt
from day1.My_table
group by category
UNION ALL SELECT category, COUNT(*) as cnt
from day2.My_table
group by category
UNION ALL ...
UNION ALL SELECT category, COUNT(*) as cnt
from day30.My_table
group by category
) group by category
Outro exemplo, o número de postagens publicadas em um mês :
SELECT COUNT(distinct id)
from (
SELECT id
from day1.My_table
UNION ALL ...
UNION ALL SELECT id
from day30.My_table
)
Basicamente, precisaríamos considerar um peso. Se tivermos day1.My_table e day5.My_table, todas as postagens que estiverem no dia1 e não no dia5 serão contadas como também no dia 2,3,4. Cada postagem que é dia1 e dia5 será contada como se estivesse em todos os dias do mês (= até o próximo instantâneo).
Portanto, caso eu queira considerar o número médio de postagens por dia de> = 6 meses, onde eu tenho apenas 1 instantâneo, atribuiria a esse instantâneo um peso de 30.
Portanto, a postagem média publicada em um mês para um intervalo> = 6 meses atrás é:
SELECT category, SUM(cnt) / 30
from (
SELECT category, COUNT(*)*30 as cnt
from day1.My_table
group by category --- Note: I'm not considering the range defined from the user in this example.
) group by category;
Como o comentário também afirmou, eu precisaria fazer uma consulta como:
Select category, AVG(*)
from [fromRange-toRange].MyTable;
Para uma solução extrema, estou considerando a ideia de implementar uma metalinguagem para permitir que o futuro usuário (por exemplo, pessoas de marketing) faça uma consulta como essa.
Você acha que existe uma maneira de fazer isso no Drill sem a meta-linguagem? Eu faria isso usando um UDF recursivo, mas eles não podem retornar consultas.
Cada instantâneo tem 250 GB e quero comparar esses conjuntos de dados com outros dados externos (não sei de antemão o esquema desses conjuntos de dados).
Existe uma solução adequada para o Apache Drill? Ou existe outra solução para esse problema?
Também é apreciada qualquer meta-linguagem ou artigo sobre esse problema.
Editar: não temos dados transacionais. Temos dados que mudam com o tempo e podem ser adicionados ou removidos; por esse motivo, precisamos de instantâneos diários. Também não sabemos de antemão as consultas que serão executadas; portanto, não podemos saber que tipo de agregação a ser feita. Além disso, cada linha possui cerca de 100 colunas e existem 250 GB por snapshot (tabelas Mysql). Também precisamos de pesquisa de texto completo nesses dados em todas as linhas, em todos os dias possíveis.
Um exemplo de pesquisa pode ser "Quantas postagens foram sobre sometópicas?" Portanto, ele deve procurar todas as postagens pela palavra-chave sometopic. Cada instantâneo pode ou não ter as mesmas linhas. Também dois snapshots podem ter a mesma postagem, mas ligeiramente modificados.
table definitions/structures