📜  什么是 Hadoop 中的 Schema On Read 和 Schema On Write?(1)

📅  最后修改于: 2023-12-03 14:49:08.964000             🧑  作者: Mango

Hadoop 中的 Schema On Read 和 Schema On Write

在 Hadoop 中,Schema On Read 和 Schema On Write 是两种处理数据的方法。这两种方法不同,它们各有优点和适用场景。

Schema On Write

Schema On Write 是一种在写入数据时定义其结构的方法。在该方法中,数据被保存为表格或关系型数据库中的结构化数据。在写入数据之前,我们需要定义数据的模式(Schema),并在写入数据时将数据存储在表格或数据库中相应的列中。这种方法使得数据可以直接用于分析和处理,因为数据已经被规整和组织好了。

然而,使用 Schema On Write 存在一些限制。首先,需要在数据写入之前确定模式,因此,在数据结构发生变化时,需要重新定义模式并重新写入数据。其次,在处理非结构化的数据时,使用此方法就会出现问题。此外,如何处理空白或缺失的数据也需要经过一些思考。

举个例子,当我们将数据保存到 MySQL 数据库中时,我们需要先定义表的结构,然后将数据写入表中。如果在后续的处理中需要修改表结构,那么需要将数据写入新的表格中,并重新计算之前的数据。这是非常繁琐和耗时的。

Schema On Read

Schema On Read 是一种在读取数据时定义其结构的方法。这种方法与 Schema On Write 不同,它允许我们在读取数据时确定其结构,而不需要在写入数据时定义其结构。这使得我们可以直接从原始数据中查询、分析或处理数据。

使用 Schema On Read 的好处在于,可以处理任意类型和格式的数据。此外,如果数据结构发生变化,只需要修改查询语句或者处理逻辑,而不需要重新定义模式或重写数据。

注意,使用此方法并不意味着完全没有规则。在读取数据之前,我们需要了解数据中各个字段的含义和类型,以便正确地进行查询和分析。这种方法更适合分析不同来源和格式的数据,并需要在数据处理前进行数据清洗和过滤的情况。

示例

下面是一个使用 Schema On Read 的示例代码片段:

# 定义数据格式
data_schema = {'name': str, 'age': int, 'gender': str}

# 读取数据
with open('data.txt', 'r') as f:
    for line in f:
        # 解析数据
        data = dict(zip(data_schema.keys(), line.strip().split(',')))

        # 处理数据
        if data['gender'] == 'male' and data['age'] > 18:
            print(data['name'])

在这个示例中,我们先定义了一个数据模式,它包含了数据中的各个字段及其类型。然后,我们使用此模式来解析从文件中读取的原始数据。最后,我们对解析后的数据进行处理。注意,我们并不需要在写入数据时提前定义数据结构,而是在读取数据时进行解析和处理。