描述非关系数据的类型
非关系数据通常分为两类:半结构化和非结构化。
什么是半结构化数据?
半结构化数据是包含字段的数据。 每个实体中的字段不必相同。 只需基于每个实体依据来定义字段。 上一单元中介绍的客户实体就是半结构化数据的示例。 数据格式必须以这样一种方式来设置,即应用程序可以对其进行分析和处理。 执行此操作的常用方法是将每个实体的数据存储为 JSON 文档。 术语 JSON 代表 JavaScript 对象表示法;它是 JavaScript 应用程序用于在内存中存储数据的格式,但也可用于在文件中读取和写入文档。
JSON 文档括在大括号({ 和 })中。 每个字段都有名称(标签),后接冒号,然后是字段的值。 字段可包含简单值或子文档(每个都以大括号开头和结尾)。 字段还可以有多个值,以数组形式保存,并用方括号([ 和 ])括起来。 字段中的文本(或固定值)用引号引起来,字段之间以逗号隔开。
下面的示例显示上一单元的客户,格式为 JSON 文档:
{
"ID": "1",
"Name": "Mark Hanson",
"Telephone": [
{ "Home": "1-999-9999999" },
{ "Business": "1-888-8888888" },
{ "Cell": "1-777-7777777" }
],
"Address": [
{ "Home": [
{ "StreetAddress": "121 Main Street" },
{ "City": "Some City" },
{ "State": "NY" },
{ "Zip": "10110" }
] },
{ "Business": [
{ "StreetAddress": "87 Big Building" },
{ "City": "Some City" },
{ "State": "NY" },
{ "Zip": "10111" }
] }
]
}
{
"ID": "2",
"Title": "Mr",
"Name": "Jeff Hay",
"Telephone": [
{ "Home": "0044-1999-333333" },
{ "Mobile": "0044-17545-444444" }
],
"Address": [
{ "UK": [
{ "StreetAddress": "86 High Street" },
{ "Town": "Some Town" },
{ "County": "A County" },
{ "Postcode": "GL8888" },
{ "Region": "UK" }
] },
{ "US": [
{ "StreetAddress": "777 7th Street" },
{ "City": "Another City" },
{ "State": "CA" },
{ "Zip": "90111" }
] }
]
}
可以自由定义任何喜欢的字段。 重要的一点是,数据遵循 JSON 语法。 当应用程序读取文档时,它可以使用 JSON 分析器将文档拆分为其组件字段并提取各个数据片段。
其他可能出现的格式包括 Avro、ORC 以及 Parquet:
- Avro 是一种基于行的格式。 它由 Apache 创建。 每条记录都包含一个标头,用于描述记录中的数据结构。 此标头以 JSON 格式存储。 数据以二进制信息的形式存储。 应用程序使用标头中的信息来分析二进制数据,并提取其中包含的字段。 Avro 是一种非常好的格式,用于压缩数据和最小化存储和网络带宽需求。 此示例部分显示了上例的标头信息(采用 Avro 格式):
{
"type": "record",
"name": "contact_schema",
"fields": [
{
"name": "id",
"type": "int",
"doc": "ID of the contact"
},
{
"name": "name",
"type": "string",
"doc": "Name of the contact"
},
{
"name": "telephone",
"type": [
"null",
{
"type": "array",
"items": {
"type": "record",
"name": "contact_schema.telephone",
"fields": [
{
"name": "phoneid",
"type": "int"
},
{
"name": "phonetype",
"type": [ "null", "string" ]
}
]
}
}
]
}
]
}
-
ORC(优化的行列式格式)将数据组织成列而不是行。 它由 HortonWorks 开发,用于优化 Apache Hive 中的读取和写入操作。 Hive 是一个数据仓库系统,支持快速数据汇总和查询大型数据集。 Hive 支持对非结构化数据进行类似于 SQL 的查询。 ORC 文件包含数据的带区。 每个带区都包含一列或一组列的数据。 带区包含对该带区中行的索引、每行的数据,以及保存着每列统计信息(count、sum、max、min 等)的脚注。
-
Parquet 是另一种列式数据格式。 它由 Cloudera 和 Twitter 创建。 Parquet 文件包括行组。 每列的数据一起存储在同一行组中。 每个行组都包含一个或多个数据块。 Parquet 文件包括描述在每个块中找到的行集的元数据。 应用程序可以使用此元数据快速找到给定行集的正确块,并为这些行检索指定列中的数据。 Parquet 专门用于有效地存储和处理嵌套数据类型。 它支持高效的压缩和编码方案。
什么是非结构化数据?
非结构化数据是不包含字段的数据。 示例包括视频、音频和其他媒体流。 每项都是二进制数据的无定形 blob。 无法在此数据中搜索特定元素。
可以选择将此类数据存储在专门为此目的设计的存储中。 在 Azure 中,可以将视频和音频数据存储为 Azure 存储帐户中的块 blob。 (blob 这个词表示“二进制大型对象”*)。 块 blob 仅支持基本的读取和写入操作。
也可以将文件视为非结构化数据的一种形式,尽管在某些情况下,文件可能包含用于指示文件类型(照片、Word 文档、Excel 电子表格等)的元数据、所有者以及可以存储为字段的其他元素。 但是,文件的主要内容是非结构化的。