ETL 面试常见问题

来源:互联网 发布:ubuntu 16.04 主题包 编辑:程序博客网 时间:2024/06/06 01:18

1.  source QualifileJoiner的区别

Source Qualifier可实现N个同构的数据源关联,Joiner组件可实现2个异构的数据源关联。前者只能关联同构数据,是在源数据库中实现关联;后者也可关联同构数据,但主要是用来关联异构数据源,关联操作是在Informatica缓存中实现的。 N个异构数据源,需要N-1Joiner组件实现关.

异构数据源:在数据仓库项目中,需要抽取的数据经常来自不同的数据源,它们的逻辑结构和物理结构都可能不同,即称之为异构数据源。

2.  Source QualifierFilter

Source Qualifier 用来从源表和源文件中抽取数据,它只能用来过滤源表的数据,而无法过滤文本的数据。为了提高性能,需尽量在SourceQualifier中将数据过滤掉。
      Filter
是用来过滤已经被Informatic读取过来的数据,针对文本文件只能使用Filter组件实现数据过滤

3.  Lookup组件的两种用法.

Cached Lookup uncashed Lookup缺省是cachedlookup cached首先将记录读到内存中,如果lookup关联表的数据量比较大,如100万条记录以上,不推荐用cachedlookup. cached估算:lookup数据量乘以字节数

4.  列到行转换用Normalizer

5.  多个文件时怎么处理的filelist ??

如果是同结构批量的文件,可以用filelist 功能.

        就是在source folder里面建一个list.txt,把文件都写在里面然后在workflow里面把Sourcefiletype选成indirect吗?

 

先建一个command
ls *FILENAME.TX >file_name_list.txt
然后用这个文件作为你的source,记住,source的类型是indirect而不是direct

1.  增量抽取:

1采用审计列

审计列指表中如“添加日期”、“修改日期”、“修改人”等信息的字段。应用程序在对该表的数据进行操作时,同时更新这些字段,或者建立触发器来更新这些字段。采用这种方式进行变化数据捕获的优点是方便,容易实现。缺点是如果操作型系统没有相应的审计字段,需要改变已有的操作型系统的数据结构,以保证获取过程涉及的每张表都有审计字段。

2数据库日志

DBMS日志获取是一种通过DBMS提供的日志系统来获得变化的数据。它的优点是对数据库或访问数据库的操作系统的影响最小。缺点是要求DBMS支持,并且对日志记录的格式非常了解。

3全表扫描

全表扫描或者全表导出文件后进行扫描对比也可以进行变化数据捕获,尤其是捕获删除的数据时。这种方法的优点是,思路清晰,适应面广,缺点是效率比较差

2.  事实表和维度表的概念以及怎么设计

事实表:

Ø 每个数据仓库都包含一个或者多个事实数据表。事实数据表可能包含业务销售数据,如现金登记事务所产生的数据,事实数据表通常包含大量的行

Ø 一般事实表中只存放数字或者一些Flag用来统计(Count),如收益、数量、支出等

维度表(Dimension Table):

Ø 维度表可以看作是用户来分析数据的窗口,维度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息,维度表包含帮助汇总数据的特性的层次结构。

粒度(Grain) 层次(Hierarchy):

Ø 粒度是指数据仓库的数据单位中保存数据的细化或综合程度的级别。细化程度越高,粒度级就越小;相反,细化程度越低,粒度级就越大。设计粒度是设计数据仓库中的一个重要的前提

Ø 层次指描述明细数据的层次

维度建模中的三种模型:

Ø 星形模型(StarSchema)

Ø 雪花模型(SnowflakeSchema)

Ø 多维模型(Multi-dimensionSchema)

一些影响维度建模的因素:

Ø 数据或展现的安全性

Ø 复杂的查询和分析

星形模型(Star Schema):

Ø 事实被维度所包围,且维度没有被新的表连接

Ø 星形模型是一个比较折中的的建模方式(BIAPPS中都是用的是星形的建模方式)

雪花模型(Snowflake Schema):

}  事实表被多个维表或一个或多个层次所包围

}  雪花模型一般在处理大的且相对静态的层次的时候使用

多维模型(Multi-DimensionSchema):

}  层次数据库,只有一个结构(立方体Cube)相当于一个多维数组。它包含了所有数据在各种级别的汇总

}  需要特定的多维数据库或者多维数据库引擎(Essbase)的支持

}  数据存储空间的问题:当新添加一个维度的时候,数据的量便会成指数增长

维度的类型:

}  缓慢变化维(Slowly Changing Dimension)

}  快速变化维(Rapidly Changing Dimension)

}  大维(Huge Dimension)和迷你维(Mini-Dimension)

}  退化维(Degenerate Dimension)

缓慢变化维(SCD):

}  大多数的维度的内容都会有不同程度的改变。比如:

}    雇员的升职

}    客户更改了他的名称或地址

}  我们如何去处理这些维度中的变化呢?

}  下面提供了三个处理缓慢变化维的方式

}    直接更新到原先记录中

}    标记记录有效时间的开始日期和结束日期,加入版本控制

}    在记录中添加一个字段来记录历史

快速变化维(FCD):

}  当某个维度的变化是非常快的时候,我们认定他为快速变化维(具体要看实际的变化频率),比如:

}    产品的价格,地产的价格等

}  对于这种快速变化维的变化捕获应该在实施中进行捕获而不是维度中

大维度(HugeDimension):

}  数据仓库中最有意思的维度是一些非常大的维度,比如客户,产品等等。一个大的企业客户维度往往有上百万记录,每条记录又有上百个字段。而大的个人客户维度则会超过千万条记录,这些个人客户维度有时也会有十多个字段,但大多数时候比较少见的维度也只有不多的几个属性。

}  大维度需要特殊的处理。由于数据量大,很多涉及大维度数据仓库功能可能会很慢,效率很低。你需要采用高效率的设计方法、选择正确的索引、或者采用其它优化技术来处理以下问题,包括:

     向大维度表填充数据

     非限制维度的浏览性能,尤其是那些属性较少的维度

     多限制的维度属性值的浏览时间

     涉及大维度表的对事实表查询的低效率问题

     为处理第二类修改所需要增加的额外的记录

迷你维(MiniDimension):

}  将常用的大维度中的少数字段提取出来,形成一个字段少的维度,在查询的时候便可以使用迷你维中的字段

}  这样的设计明显提高查询效率

事实的类型:

}  粒度事实表(Additive Fact)

}  周期快照事实表(Semi-Additive Fact)

}  聚合快照事实表(Non-Additive Fact)

}  非事实事实表(Factless Fact Table)

粒度事实表(AdditiveFact):

}  表示的是在特定时间、空间点上的一次瞬间的测量。与粒度同层次的事实表,可以直接将事实字段进行Sum,Count等聚合操作

}  在事实表的设计时,一定要注意一个事实表只能有一个粒度,不能将不同粒度的事实建立在同一张事实表中。

}  交易粒度事实表的来源伴随交易事件成生的数据,例如销售单。在ETL过程中,以原子粒度直接进行迁移。

周期快照事实表(Semi-AdditiveFact)

}  周期快照事实表表现的是一个时间段,或者规律性的重复。这类表非常适合跟踪长期的过程,例如银行账户和其他形式的财务报表。最常用的财务上的周期快照事实表通常有一个月粒度。在周期快照事实表中的数据必须符合该粒度(就是说,他们必须量测的是同一个时间段中的活动)。对于一个好的周期快照事实表来说就是在粒度上有更多的事实。

}  在ETL过程中,以固定的时间间隔生成累计数据。

聚合快照事实表(Non-AdditiveFact):

}  聚合快照事实表用于描述那些有明确开始和结束的过程,例如合同履行,保单受理以及常见的工作流。聚合快照不适合长期连续的处理,如跟踪银行账户或者描述连续的生产制造过程,如造纸。

}  聚合快照事实表的粒度是一个实体从其创建到当前状态的完整的历史。

}  在ETL过程中,随着业务处理过程的步骤逐步完善该表中的记录。

 

非事实事实表(FactlessFact Table):

}  每个事实表的粒度是一个事件量测。用来描述数据或事件。事件可以发生,但是没有具体的测量值。

维度建模的一般过程:

}  1确定每个事实表的粒度

}  2确定维度的属性

}  3确定维度的层次

}  4确定每个事实所需要关联的维度

}  5确定事实,包括预先计算的

}  6确定缓慢变化维

确定每个事实表的粒度

}  确定详细数据的粒度级别

}  此过程必须是在建模之前最需要考虑的问题

}  比较典型的粒度指的是单独的,基于时间的或聚集在一个常用的维度的事务

确定维度的属性

}  去定是否需要同时存储编号和描述,或者只是编号,或者只是描述的信息

}  确定哪些字段的值需要被筛选掉或者需要存在

确定维度的层次

}  对于时间维度,我们需要确定的是年,季度,月,周,日等不同的层次

}  对于产品维度,我们需要确定的是产品大类,产品小类,产品等不同的层次

}  需要注意的是比如在销售中,地理位置的层次可能和真正的地理位置的层次会有不同

确定每个事实所需要关联的维度

}  通常的维度包括时间,产品,投保人,代理人,和地理等常见对象

}  请注意,创建的维度需要和与其连接的事实的粒度保持一致

确定事实及量度(包括预先计算的事实)

}  需要根据具体业务来确定事实及其量度

}  对于每个聚合事实需要在应用(ETL)过程中进行计算

确定缓慢变化维

}  根据需求,对缓慢变化维进行相应的处理

}  比如:

      对于一个需求为不保留历史的客户维度,我们使用第一种类型的缓慢变化维来处理

      对于一个需求为需要保留历史的产品维度,我们需要使用第二种类型的缓慢变化维来处理

      在常规的数据流传递途径上,第三种方式不经常出现,相反,他们经常是一种ETL 团队成员间口头上执行决定

 

 

3.  分区表

范围分区表;列表分区表;哈希分区表;组合分区表

范围分区表:一般是基于日期和值,Range分区与分区相关联,为分区列假设了一个值的自然范围,故不可能将该值的范围以外的分区组织到一起。可以对多列进行分区

partition by range (sales_date)  --创建基于日期的范围分区并存储到不同的表空间

                     (

                     partition sal_jan2000 valuesless than(to_date('02/01/2000',

                           'DD/MM/YYYY'))tablespace sal_range_jan2000,

                     partition sal_feb2000 valuesless than(to_date('03/01/2000',

                           'DD/MM/YYYY'))tablespace sal_range_feb2000,

                     partition sal_mar2000 valuesless than(to_date('04/01/2000',

                           'DD/MM/YYYY'))tablespace sal_range_mar2000,

                     partition sal_apr2000 valuesless than(to_date('05/01/2000',

                           'DD/MM/YYYY'))tablespace sal_range_apr2000

                     );

              partition by 用于指定分区方式

              range 表示分区的方式是范围划分

              partition pn 用于指定分区的名字

              values less than 指定分区的上界(上限)

               添加分区:

                     ALTER TABLE r

                     add partition p5 values less than (xxx) tablespace xx;

列表分区表:List分区的优点在于按照自然的方式将无序和不相关的数据集合分组。但不支持多列分区,如果将表按列分区,那么分区键就只能有表的一个单独列组成。

Hash分区:散列分区  Hash分区能够很容易对数据进行分区,因为语法很简单,很容易实现,

hash分区时不允许对数据的划分进行控制,因为系统使用的是散列函数来划分数据的。可以对多列进行分区

分裂、删除和合并分区不能应用于Hash分区,但是,Hash分区能够合并和添加。

   创建hash分区有两种方法:一种方法是指定分区数量,另一种方法是指定分区的名字,但两者不能同

时指定。

               方法一:指定分区数量

              create table dept2 (deptno number,deptnamevarchar2(32))

              partition by hash(deptno) partitions 4;

 

              方法二:指定分区的名字

              create table dept3 (deptno number,deptnamevarchar2(32))

              partition by hash(deptno)             

              (partition p1tablespace p1,

              partition p2 tablespace p2);

组合分区: 组合分区使用range方法分区,在每个子分区中使用hash方法进行再分区

              partition by range(sales_date)

              subpartitionby hash(salesman_id)

              subpartitions4

              storein (tbs1,tbs2,tbs3,tbs4)

              (partitionsales_jan2000values less than(to_date('02/01/2000','DD/MM/YYYY')),

              partition sales_feb2000 valuesless than(to_date('03/01/2000','DD/MM/YYYY')),

              partition sales_mar2000 valuesless than(to_date('04/01/2000','DD/MM/YYYY'))

              );

 

4.   物化视图

物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。

5.  游标

游标(CURSOR)也叫光标,在关系数据库中经常使用,在PL/SQL程序中可以用CURSOR与SELECT一起对表或者视图中的数据进行查询并逐行读取。

Oracle游标分为显示游标和隐式游标。
显示游标(ExplicitCursor):在PL/SQL程序中定义的、用于查询的游标称作显示游标。
隐式游标(ImplicitCursor):是指非PL/SQL程序中定义的、而且是在PL/SQL中使用UPDATE/DELETE语句时,Oracle系统自动分配的游标。


0 0
原创粉丝点击