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.
fonte
table definitions/structures
Respostas:
Vamos pensar fora da caixa. Em vez de ter um "instantâneo", vamos ter um "log". O que você tem atualmente é o estado "atual" das coisas; adicionar um "log" forneceria o "histórico", do qual poderiam ser derivadas as informações "perdidas".
Uma maneira de implementar o log é ter um
TRIGGER
onINSERT
ouUPDATE
da tabela e fazer com que o gatilho grave no arquivo de log. Esse registro não será agradável para as consultas ad hoc; portanto, tenha um trabalho noturno (ou talvez a cada hora) que resuma as alterações do dia - ganho (ou perda) líquido de número de postagens etc. O "dia2" informações e as informações do "último mês" podem ser derivadas dessa tabela de resumo rapidamente. Ou talvez um segundo nível de resumo que declare qual era o estado para cada dia. DuvidoUNION
que seja necessário. O "instantâneo" não estaria envolvido.fonte
Então, o que eu procurava é um novo tipo de sistema relacionado ao Datawarehousing: Data Lake System.
Você pode aprender mais na Wikipedia :
fonte