SAD: 4º Projecto DW
Limpeza e
transformação de dados
Suponha a operação de junção aproximada, que pode ser expressa pelo operador
Match da framework de limpeza e transformação e dados AJAX. Pretende utilizar
esta operação para detectar registos aproximadamente duplicados de clientes. A
tabela
Clientes
tem o seguinte esquema:
Clientes(clId, nome)
e resultou da integração de duas tabelas
Cliente(Id, nome)
e
Customer(custId,
name)
. A chave
clId
não pode ser utilizada para detectar duplicados aproximados.
Consideram-se duplicados aproximados os registos de Clientes cuja distância de
edição entre os seus nomes é inferior ou igual a 2. Considere uma função de
distância de edição
editDist(s1, s2)
que aceita como entradas duas cadeias de
caracteres
s1, s2
e devolve um número inteiro que representa a distância de edição
entre as duas cadeias.
a) (1pt) Escreva em SQL uma interrogação que devolve os pares de identificadores de
clientes (clID1, clID2) que correspondem a clientes aproximadamente duplicados.
b) (3pts) Que problema pode trazer a execução desta interrogação num SGBD
Relacional? Escreva o pseudo-código de um algoritmo de execução para esta
operação, potencialmente mais eficiente que o escolhido pelo optimizador do
SGBDR, que podia ser considerado como equivalente (ou seja, o resultado era o
Select c1.clId clId1, c2.clId clId2
from Clientes C1, Clientes C2
where editDistance (C1.nome,
C2.nome) <= 2
and C1.nome != C2.nome
b) Existe um problema de desempenho: o SGBD executa o produto
cartesiano entre as duas tabelas (ou da tabela por ela própria) e
aplica a função de distância a cada tuplo do produto cartesiano
Pseudo-código de um algoritmo alternativo baseado no tamanho das
cadeias de caracteres para filtrar os tuplos de entrada ao produto
cartesiano.
cl1 ~ cl2 se dist(cl1.nome, cl2.nome) <= 2
A optimização consiste em determinar um mapeamento f() e uma
função dist’(), tal que:
Dist’(f(cl1.nome), f(cl2.nome)) <= 2 and
Dist’(f(cl1.nome), f(cl2.nome)) < = dist (cl1.nome, cl2.nome)
Vamos usar:
f(string) = len(string)
dist’(x,y) = |x – y|
Input: Π
nome(Clientes), editDist, 2
{
P – cjto de partições de Π
nome(Clientes) de acordo com len()
Para cada partição p1 ∈ P {
Para cada partição P2 ∈ P tal que |P1.len –P2.len| <= 2 do {
para cada s1
∈
P1 do {
para cada s2
∈
P2 do {
if editDist(s1, s2) < = 2 then
output = output ∪ (s1, s2) }}}}}
SQL Server 2005 Integration
Services
Siga as cinco lições do tutorial do Integration Services. Após a 5ª lição, terá aprendido como ler registos de um ficheiro (ou mais) de texto, verificar se determinados valores contidos nas linhas desse ficheiro pertencem às tabelas de dimensões DimCurrency e DimTime
(operações de lookup) e a carregar as linhas que obedeçam às condições das operações de lookup para a tabela de factos FactCurrencyRate. Terá também aprendido a escrever, numa tabela de log, os registos do ficheiro de entrada que contenham valores errados e que por isso não possam ser processados pelas operações de lookup.
a) Assuma um único ficheiro de entrada SampleCurrencyData.txt (como nas lições 1 e 2) e que o ficheiro de entrada é escrito numa tabela cujas colunas correspondem às colunas do ficheiro. Dê a essa tabela o mesmo nome do ficheiro. Escreva em SQL uma interrogação para cada operação de lookup. Suponha que o resultado da primeira operação de lookup é escrito numa tabela intermédia com nome OutLookupCurrency.
b) Escreva em SQL o conjunto de instruções SQL que correspondem à sequência: Lookup Currency Key, Lookup Date Key, Sample OLE DB Destination. Assuma a criação de tabelas intermédias para armazenar o resultado de algumas interrogações.
c) Como conseguiria modificar uma das interrogações que correspondem às operações de
Lookup de modo a escrever os registos de entrada errados para uma tabela de saída, denominada LogTable?
d) Como se comporta o SQL quando existe um erro no processamento de uma interrogação,
por exemplo quando se tenta executar uma instrução de insert de vários tuplos numa tabela e um dos tuplos viola a restrição de chave primária? O que acontece aos outros tuplos que