ETL、Hive、HDFS、SQL

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数据库和其他数据库区别:

  1. hive数据库是使用hdfs存储数据的,oracle数据库使用.dbf文件存储数据

  2. hive数据库使用mr引擎计算数据,oracle有自己自带的executor进行计算

  3. hive的语句运行延迟比较高,oracle延迟很低

  4. hive支持的容量比较大,可以支持TB PB,但是oracle只能支持GB

  5. hive数据库没有约束条件的部分,oracle有约束

  6. 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:

  1. SYSDATE: 返回当前日期和时间。

  2. TO_DATE: 将字符转换为日期。

  3. TO_CHAR: 将日期转换为字符。

  4. NVL: 如果表达式为 NULL,则返回另一个指定的值。

  5. NVL2: 如果表达式不为 NULL,则返回一个指定的值,否则返回另一个指定的值。

  6. DECODE: 根据条件返回不同的值。

  7. CASE: 类似于 DECODE,用于条件判断。

  8. COALESCE: 返回参数列表中的第一个非 NULL 值。

  9. SUBSTR: 返回字符串的子串。

  10. INSTR: 返回子串在字符串中的位置。

  11. LENGTH: 返回字符串的长度。

  12. TRIM: 去除字符串两端的空格。

  13. UPPER: 将字符串转换为大写。

  14. LOWER: 将字符串转换为小写。

  15. LPAD: 在字符串的左侧填充指定的字符。

  16. RPAD: 在字符串的右侧填充指定的字符。

  17. ROUND: 将数值四舍五入为指定的小数位数。

  18. TRUNC: 截断日期或数值到指定的精度。

  19. ADD_MONTHS: 在日期上增加指定的月数。

  20. MONTHS_BETWEEN: 计算两个日期之间的月份数。

  21. LAST_DAY: 返回给定月份的最后一天。

  22. NEXT_DAY: 返回给定日期之后的下一个指定星期几的日期。

  23. INITCAP: 将字符串的每个单词的首字母转换为大写。

  24. CONCAT: 连接两个字符串。

  25. REPLACE: 替换字符串中的指定子串。

  26. TRANSLATE: 替换字符串中的字符。

Hive排序:

order by 是整个表格的数据当成一个进程进行整体的排序

sort by 可以根据 mapred.reduce.tasks进行分组的设置,每个组分别进行排序

cluster by 只能对该列进行升序排序

distribute by 本身没有排序功能,需要和sort by一起

Hadoop架构:

使用hdfs进行数据的存储

使用mapreduce进行数据的计算

使用yarn进行资源的调度

使用hive编写sql语句

使用mysql存储表格的元数据结构

**Hive优化:

  1. 数据分区和分桶:使用分区和分桶可以减少查询时需要扫描的数据量,加速查询速度。

  2. 合理设置表参数:通过设置表的存储格式、压缩方式、序列化格式等参数,可以降低数据存储成本,并提高查询性能。

存储格式:也就是表格的四种存储格式
TextFile(文本)、SequenceFile(二进制)、Rcfile(列 也叫表存储)、ORC(Oracle的行列混合)
压缩方式:就是压缩,减少数据在磁盘上的存储空间,降低存储成本,并且在查询时可以减少IO开销,提高查询性能
Parquet--表存储属性
数据文件的存放位置、存储格式、压缩方式等。可以通过设置表的存储属性来优化数据存储和查询性能。
CREATE TABLE table_name (
    ...
) STORED AS Parquet
LOCATION '/user/hive/warehouse/table_name';

  1. 合理使用索引:合理使用索引可以加速查询速度。

  2. 数据压缩:对于大数据量的数据,来减少存储空间和IO开销。

  3. 合理设置并行度:通过设置并行度参数来控制MapReduce任务的并行度,以充分利用集群资源并加速查询执行。

  4. 避免使用全表扫描:尽量避免全表扫描操作,尤其是对大表的全表扫描会造成严重的性能问题。

  5. 适当使用分布式缓存:使用Hive的查询缓存和结果缓存功能,可以减少重复查询的计算开销,提高查询性能。

查询缓存和结果缓存的区别就是,
查询缓存是存储在内存和磁盘中的,而结果是存储在分布式存储系统中如hdfs;
都是通过将查询的结果缓存,然后执行命令时根据结果去查找 找到输出,找不到在继续执行操作

  1. 数据预处理:对原始数据进行预处理,如过滤无效数据、去除重复数据等,可以减少后续查询的数据量。

参见上方ETL部分中 数据清洗解决方案

  1. 合理设计表结构:根据实际业务需求合理设计表的结构,避免冗余字段和不必要的表关联操作。

参见上边优化部分
  1. 调整内存配置:根据查询的复杂度和数据规模,合理调整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的数量:

  1. 设置任务数量参数:可以通过在Hive查询中使用特定的配置参数来设置Map和Reduce任务的数量。例如,可以使用以下语句在查询中指定Map任务的数量:

SET mapreduce.job.maps=<map任务数量>;

或者指定Reduce任务的数量:

SET mapreduce.job.reduces=<reduce任务数量>;
  1. 设置默认配置:还可以通过修改Hive的默认配置文件,如hive-site.xml,在其中指定默认的Map和Reduce任务数量。这样,在没有显式指定任务数量的查询中,Hive将使用默认的任务数量配置。

  2. 调整输入数据切片大小:Map任务的数量通常由输入数据的切片数决定,可以通过调整输入数据的切片大小来间接控制Map任务的数量。如果输入数据切片较大,可能会导致更多的Map任务被创建。

数据块:Hadoop默认128mb;

如果输入数据切片较大,即每个数据块的大小较大,可能会导致更少的数据块被创建,从而减少了Map任务的数量。这可能会降低作业的并行度,导致作业的执行速度变慢。相反,如果输入数据切片较小,可能会导致更多的数据块被创建,从而增加了Map任务的数量,提高了作业的并行度和执行速度。

假如Hadoop集群处理1TB的文件的话,按照128mb 需要8000,将有更少的数据块可供Map任务处理,从而减少了Map任务的数量,降低了作业的并行度和执行速度,反之,256mb需要四千,则会提高;

  1. 使用分区表:对于分区表,可以根据表的分区数量来调整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操作:

  1. 插入数据:可以使用INSERT INTO语句将数据插入到表中。或者LOAD DATA加载;

  2. 更新数据:Hive不支持直接的更新操作,但可以通过INSERT OVERWRITE语句覆盖原有数据实现更新。

  3. 删除数据:Hive不支持直接的删除操作,但可以使用INSERT OVERWRITE语句覆盖原有数据,并过滤掉要删除的数据来实现删除效果。

猜你喜欢

转载自blog.csdn.net/m0_74940474/article/details/137922841
ETL