Data Warehouse: como posso consultar instantâneos diários?

9

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.

Federico Ponzi
fonte
Parece que você tem uma estrutura decente para os seus dados. Existe algum motivo específico para procurar uma solução sem esquemas? Pelo esquema Estou assumindotable definitions/structures
vmachan
Porque eu não quero definir novas tabelas antes de carregar meus conjuntos de dados. Claro, se existe uma solução que possa lidar com esse problema, mas precisa ser definida com antecedência, eu a escolheria de qualquer maneira.
Federico Ponzi 29/01
Instantâneos diários de 250 GB? Com esses requisitos? Quão?
Tom V - tentativa topanswers.xyz
Por que instantâneos diários? Quanto dos 250 GB muda por dia? O que há de errado com uma abordagem de dimensões que mudam lentamente?
dnoeth
Por favor, não pense esse problema em termos de data warehousing, mas em termos de como consultar e / ou big data. Tenho diferentes instantâneos diários do meu banco de dados e gostaria de consultá-los de maneira eficaz.
Federico Ponzi

Respostas:

2

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 TRIGGERon INSERTou UPDATEda 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. Duvido UNIONque seja necessário. O "instantâneo" não estaria envolvido.

Rick James
fonte
11
Eu perguntei sobre como consultar instantâneos diários, você está apenas falando sobre uma otimização - pensarei nisso mais tarde. Obrigado
Federico Ponzi
11
Os snapshots são difíceis de lidar (na minha opinião), então eu estava tentando apresentar uma maneira de resolver o problema 'real' em vez de ficar atolado em uma solução difícil. Além disso, o resumo permitirá consultas significativamente mais rápidas.
Rick James
2

Então, o que eu procurava é um novo tipo de sistema relacionado ao Datawarehousing: Data Lake System.

Você pode aprender mais na Wikipedia :

Um data lake é um método de armazenamento de dados dentro de um sistema que facilita a colocação de dados em esquemas variantes e formas estruturais, geralmente arquivos ou blobs de objetos. O Hadoop e a plataforma AWS S3 podem ser usados ​​para criar repositórios de data lake.

Federico Ponzi
fonte