ETL部分:
数据抽取:
确定数据源,确定需要从那些数据源中提取数据,根据数据源的类型选择抽取工具,配置抽取规则,指定要抽取数据表,字段,抽取频率等
数据清洗:
对抽取的数据进行清洗,包括去除重复数据、处理缺失值、纠正错误数据等,确保数据的准确性和一致性。
去重
使用SQL语句进行去重操作,通过 DISTINCT,ROWID语句获取唯一值。
在Python中使用pandas库的drop_duplicates()方法去除DataFrame中的重复行。--或者python集合 把需要去重的数据包进集合中,数据量大很鸡肋;
import pandas as pd # 创建一个重复数据 data = {'A': [1, 2, 2, 3, 4, 4], 'B': ['a', 'b', 'b', 'c', 'd', 'd']} df = pd.DataFrame(data) # 去除重复行 df_unique = df.drop_duplicates()在Excel中使用“数据”选项卡下的“删除重复项”功能去除重复数据。
缺失值
使用SQL语句进行缺失值处理,可以使用WHERE子句过滤缺失值或者使用COALESCE()函数替换缺失值为指定值。--------coalesce 类似于NVL函数,
在Python中使用pandas库的dropna()方法删除包含缺失值的行或者使用fillna()方法填充缺失值。
import pandas as pd # 删除包含缺失值的行 df_without_missing = df.dropna() # 填充缺失值为指定值 df_filled = df.fillna(value)在Excel中使用“数据”选项卡下的“查找和选择”功能查找并替换缺失值。
纠正错误数据
使用SQL语句进行数据纠错,可以通过UPDATE语句更新错误数据为正确值。
在Python中使用pandas库进行数据清洗,可以使用条件语句过滤并替换错误数据。
import pandas as pd # 创建包含学生考试成绩的 DataFrame data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'], 'Math_Score': [90, -5, 80, 95]} df = pd.DataFrame(data) # 打印原始 DataFrame print("Original DataFrame:") print(df) # 使用条件语句过滤并替换错误数据 df.loc[df['Math_Score'] < 0, 'Math_Score'] = 0 # 打印清洗后的 DataFrame print("\nCleaned DataFrame:") print(df)在Excel中使用公式或者条件格式进行数据清洗,可以通过IF函数或者条件格式设置来纠正错误数据。
数据加载:
批量加载:一次增加,全部加载进去
增量加载:增加所需要的
以Talend为例(拓蓝):
连接源系统:在Talend Studio中配置数据库连接或文件连接,选择需要的数据源。
设计作业:通过Talend Studio的可视化界面设计数据加载作业,包括提取、清洗、转换和加载等操作。
执行作业:将设计好的作业保存并执行,观察执行日志和结果,确保数据加载任务顺利完成。
监控和调优:根据执行日志和性能指标,对加载任务进行监控和调优,优化数据加载效率和质量。
数据管理:
建立数据仓库的管理和维护机制,包括数据备份、恢复、权限管理、版本控制等,确保数据的安全和可靠性。
数据库自带工具,Oracle的expdp,RMAN MySQL的mysqldump,版本控制-数字字典,记录数据仓库中的结构字段含义来源等信息
性能优化:
定期对数据仓库进行性能优化,包括索引优化、查询优化、分区表设计等,提高数据查询和分析的效率。
索引优化:
1.创建合适的索引,加速查询 提高查询效率。
2.根据查询频率高的字段创建索引,避免使用不必要的索引。
3.避免创建过多的索引,以减少维护成本。
4.定期对索引进行重建,重新组织,更新,提高效率。
5.尽量避免在索引列上使用函数或表达式,这会导致索引失效。
查询优化:
1.优化SQL查询语句,合理使用索引,避免全表扫描等方式来提高性能。
2.避免使用select * 尽量有where子句限制数据范围。
3.避免在WHERE子句中使用函数或表达式,以免引起全表扫描。
4.尽量使用等值查询(=),避免使用模糊查询(LIKE)。
5.合理使用分页 limit offset。
6.如果数据量大,可以考虑使用分页查询,避免一次性加载所有数据。
7.尽量减少子查询语句,必要优化子查询语句。
8.尽量避免使用嵌套子查询,可以考虑使用JOIN替代。
9.使用explain (plan)分析查询计划 进行优化。
10.定期清理无用的数据。
11.将复杂的查询逻辑封装存储过程/函数中,减少传输和减轻数据库的负担。
分区表设计:
1.对于大型表,可以考虑使用分区表来提高查询性能,特别是在查询大量历史数据时。
CREATE TABLE table_name ( column1 data_type, column2 data_type, ... ) PARTITIONED BY (partition_column1 data_type, partition_column2 data_type, ...) ---PARTITIONED BY用于指定分区列,可以有一个或多个分区列,每个分区列都有对应的数据类型。2.根据时间分区:
CREATE TABLE sales ( id INT, sale_date DATE ) PARTITION BY RANGE (YEAR(sale_date)) ( PARTITION p1 VALUES LESS THAN (2000), PARTITION p2 VALUES LESS THAN (2005), PARTITION p3 VALUES LESS THAN (2010), PARTITION p4 VALUES LESS THAN (2015), PARTITION p5 VALUES LESS THAN (2020) );3.把一张没有分区的表,转化为分区的表:
使用create table as select方式创建一个分区表,然后将普通表重命名,然后对新的分区表创建所需索引,重命名等。 CREATE TABLE T_NEW () ...--带分区 AS SELECT * FROM T; RENAME T TO T_OLD; RENAME T_NEW TO T;4.
分区表:
分区表设计可以将数据按照某个字段(如时间字段)进行分区存储,可以提高查询效率和管理灵活性,例如按照时间范围进行分区,可以减少查询的数据量,提高查询速度。
动态分区和静态分区的区别?
1. 静态分区可以load data和insert两种方式添加数据,动态只能通过insert的方式添加数据
2. 静态需要自己指定分区的内容,动态是通过查询结果自动指定和分配的
3. 动态需要打开动态分区和非严格模式的开关
分区和分桶的区别?
1. 分区是通过partitioned by (新字段) 进行分区设置的,分桶是通过clustered by (已有字段) 进行分桶设置的
2. 分区是以文件夹的方式分开保存数据的,分桶是分成不同的文件保存数据的
3. 分区是在查询分区字段的时候加快查询速度,分桶是对分桶字段进行表格的联合查询的时候进行联合查询加速的
一个分区表,一个非分区表,如何用非分区表中的字段作为分区表的分区值?
直接做动态分区就好了,使用 insert overwrite table 分区表 partition(分区字段) select xxxx from 非分区表;
SQL优化:
结合以上性能优化加以补充即可;
Hive-HDFS:
hive数据库和其他数据库区别:
hive数据库是使用hdfs存储数据的,oracle数据库使用.dbf文件存储数据
hive数据库使用mr引擎计算数据,oracle有自己自带的executor进行计算
hive的语句运行延迟比较高,oracle延迟很低
hive支持的容量比较大,可以支持TB PB,但是oracle只能支持GB
hive数据库没有约束条件的部分,oracle有约束
hive没有索引,oracle有索引
传统数仓和大数据数仓区别:
l 传统数仓主要是结构化的数据,大数据数仓有结构化,半结构化,非结构化的数据
l 传统数仓数据量为GB,TB;大数据数仓数据量为pb级
l 传统数仓用oracle存储,大数据数仓用hdfs,hbase存储
l 传统数仓主要处理离线数据,大数据数仓既可以处理离线数据,也能处理实时数据
Hive-Oracle函数:
Hive:
聚合 sum avg min max count
单行
数字 abs round floor ceil power
字符串 substr concat concat_ws replace instr split translate upper lower initcap lpad rpad length trim ltrim rtrim get_json_object
时间日期 current_timestamp unix_timestamp from_unixtime add_months months_between date_add datediff last_day
数据类型转换 cast
数组 array size collect_list collect_set explode
映射 map map_keys map_values
分析
排名 row_number rank dense_rank
平移 lag lead
逻辑 nvl case...when...
Oracle:
SYSDATE: 返回当前日期和时间。
TO_DATE: 将字符转换为日期。
TO_CHAR: 将日期转换为字符。
NVL: 如果表达式为 NULL,则返回另一个指定的值。
NVL2: 如果表达式不为 NULL,则返回一个指定的值,否则返回另一个指定的值。
DECODE: 根据条件返回不同的值。
CASE: 类似于 DECODE,用于条件判断。
COALESCE: 返回参数列表中的第一个非 NULL 值。
SUBSTR: 返回字符串的子串。
INSTR: 返回子串在字符串中的位置。
LENGTH: 返回字符串的长度。
TRIM: 去除字符串两端的空格。
UPPER: 将字符串转换为大写。
LOWER: 将字符串转换为小写。
LPAD: 在字符串的左侧填充指定的字符。
RPAD: 在字符串的右侧填充指定的字符。
ROUND: 将数值四舍五入为指定的小数位数。
TRUNC: 截断日期或数值到指定的精度。
ADD_MONTHS: 在日期上增加指定的月数。
MONTHS_BETWEEN: 计算两个日期之间的月份数。
LAST_DAY: 返回给定月份的最后一天。
NEXT_DAY: 返回给定日期之后的下一个指定星期几的日期。
INITCAP: 将字符串的每个单词的首字母转换为大写。
CONCAT: 连接两个字符串。
REPLACE: 替换字符串中的指定子串。
TRANSLATE: 替换字符串中的字符。
Hive排序:
order by 是整个表格的数据当成一个进程进行整体的排序
sort by 可以根据 mapred.reduce.tasks进行分组的设置,每个组分别进行排序
cluster by 只能对该列进行升序排序
distribute by 本身没有排序功能,需要和sort by一起
Hadoop架构:
使用hdfs进行数据的存储
使用mapreduce进行数据的计算
使用yarn进行资源的调度
使用hive编写sql语句
使用mysql存储表格的元数据结构
**Hive优化:
数据分区和分桶:使用分区和分桶可以减少查询时需要扫描的数据量,加速查询速度。
合理设置表参数:通过设置表的存储格式、压缩方式、序列化格式等参数,可以降低数据存储成本,并提高查询性能。
存储格式:也就是表格的四种存储格式 TextFile(文本)、SequenceFile(二进制)、Rcfile(列 也叫表存储)、ORC(Oracle的行列混合) 压缩方式:就是压缩,减少数据在磁盘上的存储空间,降低存储成本,并且在查询时可以减少IO开销,提高查询性能 Parquet--表存储属性 数据文件的存放位置、存储格式、压缩方式等。可以通过设置表的存储属性来优化数据存储和查询性能。 CREATE TABLE table_name ( ... ) STORED AS Parquet LOCATION '/user/hive/warehouse/table_name';
合理使用索引:合理使用索引可以加速查询速度。
数据压缩:对于大数据量的数据,来减少存储空间和IO开销。
合理设置并行度:通过设置并行度参数来控制MapReduce任务的并行度,以充分利用集群资源并加速查询执行。
避免使用全表扫描:尽量避免全表扫描操作,尤其是对大表的全表扫描会造成严重的性能问题。
适当使用分布式缓存:使用Hive的查询缓存和结果缓存功能,可以减少重复查询的计算开销,提高查询性能。
查询缓存和结果缓存的区别就是, 查询缓存是存储在内存和磁盘中的,而结果是存储在分布式存储系统中如hdfs; 都是通过将查询的结果缓存,然后执行命令时根据结果去查找 找到输出,找不到在继续执行操作
数据预处理:对原始数据进行预处理,如过滤无效数据、去除重复数据等,可以减少后续查询的数据量。
参见上方ETL部分中 数据清洗解决方案
合理设计表结构:根据实际业务需求合理设计表的结构,避免冗余字段和不必要的表关联操作。
参见上边优化部分
调整内存配置:根据查询的复杂度和数据规模,合理调整Hive任务的内存配置,以避免OOM或性能不佳的情况。
调整Hive任务的内存分配比例: Map阶段和Reduce阶段。可以根据任务的特性和数据处理过程来调整内存分配比例,以保证每个阶段都能够充分利用可用的内存资源,提高任务的执行效率。---看MAP、REDUCE如何设置; 使用动态分区调整:根据任务的需求动态调整内存分区的大小和数量,以最大限度地提高内存利用率和任务性能。 ---看动态分区和静态分区区别; 监控内存使用情况:定期监控Hive任务的内存使用情况,及时发现和解决内存相关的性能问题。可以使用Hadoop集群监控工具或第三方监控工具来实时监控内存使用情况,并根据监控结果进行调整和优化。--zabbix监控工具 优化查询语句:优化查询语句可以减少任务的内存消耗,提高查询性能。可以通过调整查询语句的逻辑结构、添加合适的索引、使用合适的连接方式等来优化查询性能,减少内存压力。---看性能优化11.根据表格的结构设置map或者reduce的数量
怎么设置map: map的数量和两个开关有关,有一个merge的合并开关和一个map.tasks的数量开关, 使用 表格的总数量大小/tasks和merge设置取最小值,计算每一个map需要运行的数量大小,查看map运行的数量是否有很大的明显的差距 怎么设置reduce: 如果我们的表格是列比较少但是行比较多的大表,那么通过reduce.tasks设置表格分桶的数量, 然后通过 select * from t distribute by 列; 进行表格的分桶。12.查看explain 分析。
13.
设置map和reduce的数量:
设置任务数量参数:可以通过在Hive查询中使用特定的配置参数来设置Map和Reduce任务的数量。例如,可以使用以下语句在查询中指定Map任务的数量:
SET mapreduce.job.maps=<map任务数量>;或者指定Reduce任务的数量:
SET mapreduce.job.reduces=<reduce任务数量>;
设置默认配置:还可以通过修改Hive的默认配置文件,如hive-site.xml,在其中指定默认的Map和Reduce任务数量。这样,在没有显式指定任务数量的查询中,Hive将使用默认的任务数量配置。
调整输入数据切片大小:Map任务的数量通常由输入数据的切片数决定,可以通过调整输入数据的切片大小来间接控制Map任务的数量。如果输入数据切片较大,可能会导致更多的Map任务被创建。
数据块:Hadoop默认128mb; 如果输入数据切片较大,即每个数据块的大小较大,可能会导致更少的数据块被创建,从而减少了Map任务的数量。这可能会降低作业的并行度,导致作业的执行速度变慢。相反,如果输入数据切片较小,可能会导致更多的数据块被创建,从而增加了Map任务的数量,提高了作业的并行度和执行速度。 假如Hadoop集群处理1TB的文件的话,按照128mb 需要8000,将有更少的数据块可供Map任务处理,从而减少了Map任务的数量,降低了作业的并行度和执行速度,反之,256mb需要四千,则会提高;
使用分区表:对于分区表,可以根据表的分区数量来调整Map任务的数量,从而更好地利用并行计算资源。
HDFS有那些组成:
NameNode:存储文件系统的元数据信息,如文件名、目录结构、数据块的位置等。
DataNode:负责存储和管理实际的文件数据块。简单理解就是具体位置。
SecondaryNameNode:辅助NameNode工作,类似备份但不是备份,相当于虚拟机的快照。
Hivesql语句如何运行:
hive窗口中编写sql语句,然后会去Mysql里面进行表格结构和位置的查询,如果表格结构没有问题,那么就会将sql语句拆分成不同的关键字,然后调用mapreduce对应关键字的java脚本模板,如果mr的模板文件运行没有问题,就会调用yarn进行资源的申请和分配,然后使用mr进行数据的计算,最后将计算的结果再回显到hive数据的窗口中。
Hive中如何对数据进行标签:
添加一个新的列 使用update更新case函数做标签
- 添加一个新的列用于存储标签信息 ALTER TABLE table_name ADD COLUMN label STRING; -- 根据条件为数据打标签,例如根据某个字段的值进行分类 UPDATE table_name SET label = CASE WHEN column_name = 'value1' THEN '标签1' WHEN column_name = 'value2' THEN '标签2' ELSE '其他' END;
Hive和SQL区别:
Hive-sql不支持等值连接,而sql支持;
Hive-sql不支持“Insert into 表 Values()”、UPDATA、DELETE操作,而sql支持;
Hive-sql不支持事务,而sql支持。
Hive支持以下DML操作:
插入数据:可以使用
INSERT INTO
语句将数据插入到表中。或者LOAD DATA加载;更新数据:Hive不支持直接的更新操作,但可以通过
INSERT OVERWRITE
语句覆盖原有数据实现更新。删除数据:Hive不支持直接的删除操作,但可以使用
INSERT OVERWRITE
语句覆盖原有数据,并过滤掉要删除的数据来实现删除效果。