转载声明:文章来源:https://www.nowcoder.com/discuss/519668588429516800
Q:怎样设计数据分层?
1. 原始数据层 ODS:此层包含从各种数据源获取的未处理的原始数据。这些数据可能来自于业务系统、日志文件、外部数据提供商等。数据在这一层通常以最原始的形式存储,没有进行任何加工处理。
2. 数据处理层 DWD:在此层,原始数据经过清洗、验证、转换等处理,以适应后续的数据分析需求。处理过程可能包括数据的格式化、空值处理、错误数据剔除、数据类型转换、数据编码等。
3. 数据聚合层 ADS:在此层,处理后的数据根据业务需求进行聚合。这可能包括事实表的创建、维度的建立、计算指标的生成等。数据在这一层通常以数据仓库模型(如星型模型或雪花模型)的形式组织。
4. 数据服务层 :此层为最终用户提供数据访问服务。这可能包括创建数据视图、数据集市、数据立方体等,以满足不同的数据分析和报表需求。数据在这一层通常以对用户友好的形式提供,如图表、仪表盘、报表等。
Q:了解的大数据组件有哪些?
1. Hadoop:Apache Hadoop 是一个开源的分布式计算框架,主要包括 HDFS(Hadoop Distributed File System)和 MapReduce 两个组件。HDFS 用于在大规模集群上存储大数据,而MapReduce 提供了一种编程模型,用于在 HDFS 上进行分布式数据处理。
2. Spark:Apache Spark 是一个快速的、通用的、大规模数据处理引擎,它提供了一个高级 API,支持 Java, Scala, Python 和 R,以及一个优化的运行时引擎,可以在大规模集群上进行高性能的数据处理。
3. Hive:Apache Hive 是一种建立在 Hadoop 上的数据仓库工具,它提供了一种类 SQL 的查询语言(HiveQL),用于查询、汇总和分析存储在 Hadoop 文件系统中的大规模数据。
4. HBase:Apache HBase 是一个建立在 Hadoop 上的分布式、列式数据库,它用于存储非结构化和半结构化的大规模数据,并提供了实时的数据访问能力。
5. Flink:Apache Flink 是一个针对批处理和流处理的大规模数据处理框架,它提供了一种高效的、分布式的、通用的流处理引擎。
6. Kafka:Apache Kafka 是一个分布式的流处理平台,主要用于构建实时的数据管道和流应用。
7. ZooKeeper:Apache ZooKeeper 是一个分布式的服务协调系统,提供了一种为分布式应用提供一致性服务的机制。
Q:spark底层计算原理?
1. RDD:RDD 是 Spark 中的基本数据结构,它是一个分布式的元素集合。每个 RDD 都被分割成多个分区,每个分区都会在集群中的不同节点上进行处理。
2. 懒加载:Spark 使用懒加载(lazy evaluation)的方式进行计算。这意味着,当用户对 RDD 执行转换操作(如 map、filter 等)时,这些操作并不会立即执行,而是记录下来,形成一个 "操作图"(或称为 "血缘图")。只有当需要返回结果给驱动程序或将数据写出到文件系统时,这些操作才会真正执行。这种方式可以让 Spark 更有效地优化计算过程。
3. 转换和动作:RDD 支持两种类型的操作:转换(transformation)和动作(action)。转换操作会生成一个新的 RDD,如 map、filter 等。动作操作会触发计算并返回结果给驱动程序,如 count、collect 等。
4. 持久化:用户可以通过持久化(persist)或缓存(cache)操作来将 RDD 保存在内存中,以便于多次访问。这对于迭代算法或共享数据集等场景非常有用。
5. 容错:RDD 通过记录转换操作的 "血缘关系"(lineage)来实现容错。如果某个分区的数据丢失,Spark 可以通过血缘关系重新计算丢失的数据,而不需要进行复杂的数据恢复。
6. 调度:Spark 使用一个 DAG(Directed Acyclic Graph)调度器来管理计算任务。Spark 会将操作图划分为多个阶段(stage),每个阶段包含多个任务(task),每个任务对应 RDD 的一个分区的计算。Spark 调度器会尽可能地将需要进行 shuffle 操作的任务放在同一阶段,以减少数据传输的开销。
7. Spark SQL, DataFrame and Dataset:除了基本的 RDD API,Spark 还提供了 Spark SQL 和 DataFrame/Dataset API,这些 API 提供了更高级的数据操作方式,如 SQL 查询和列式操作等。同时,它们还能享受到 Catalyst 优化器的优化,提高计算效率。
Q:join底层逻辑
1. 嵌套循环连接(Nested Loop Join):这是最基本的 JOIN 实现方式。对于每一行 R 在表 A 中,扫描整个表 B 查找匹配的行。这种方法简单直观,但如果两个表的大小都很大,那么这种方法的效率会非常低。
2. 排序合并连接(Sort Merge Join):在这种方法中,数据库首先将两个表按照连接键进行排序,然后同时扫描两个表进行连接。这种方法的优点是不需要索引,并且在两个表的大小差不多时效率很高。但如果两个表的大小差别很大,那么这种方法的效率就不是很高。
3. 散列连接(Hash Join):散列连接是一种在内存中通过散列技术处理连接操作的方法。这种方法中,数据库首先选取两个表中的一个(通常是较小的那个),然后根据连接键创建一个散列表。然后,数据库扫描另一个表,并使用相同的散列函数处理连接键,找到在散列表中的匹配行。散列连接在处理大规模数据时效率很高,但它要求至少有一个表(或两个表的一部分)能够放进内存。
Q:举例A(3) join B (5) 有几条数据
在 SQL 中,JOIN 操作是根据给定的连接条件,将两个表中的行组合在一起。如果你没有给出具体的连接条件,我将假设你是在问一个简单的交叉连接(CROSS JOIN),也称为笛卡尔积。对于表 A 有 3 条记录,表 B 有 5 条记录,做 CROSS JOIN,结果将会有 3 * 5 = 15 条记录。这是因为每一条来自 A 的记录都会与 B 中的每一条记录配对,所以总的配对数就是 A 和 B 中记录数的乘积。
然而,如果你是在问其他类型的 JOIN(例如 INNER JOIN,LEFT JOIN,RIGHT JOIN 或 FULL JOIN),那么结果将取决于给定的连接条件以及满足这些条件的行的数量。