支持的半结构化数据格式

本主题介绍支持的半结构化数据格式。

本主题内容:

Snowflake 原生支持以下半结构化数据格式。具体而言,Snowflake 在 COPY 命令中提供了相关选项,用于加载和卸载这些格式的数据文件。

JSON

什么是 JSON?

JSON (JavaScript Object Notation) 是一种基于 JavaScript 编程语言子集的轻量级、纯文本、数据交换格式。

JSON 数据可由应用程序生成。一些常见示例包括:

  • 使用原生方法生成 JSON 的 JavaScript 应用程序。

  • 使用库(通常带有扩展)生成 JSON 数据的非 JavaScript 应用程序。

  • 临时的 JavaScript 生成器。

  • JSON 文档的串联(可以分隔,也可以不分隔)。

由于没有正式的规范,因此各种实现之间存在显著差异。如果 JSON 解析器的语言定义很严格,那么这些差异将导致无法导入类似 JSON 的数据集。为了使 JSON 数据集的导入尽可能没有问题,Snowflake 遵循“自由接受”的规则。其目的是接受尽可能广泛的 JSON 和类似 JSON 的输入,以便进行明确的解释。

本主题介绍 Snowflake 接受的 JSON 文档的语法。

有关 JSON 的更多信息,请参阅 json.org (http://www.json.org)。

基本 JSON 语法

JSON 数据是按对象和数组分组的名/值对的分层集合:

  • 冒号“:”分隔名/值对中的名称和值。

  • 大括号“{}”表示对象。

  • 方括号“[]”表示数组。

  • 逗号“,”分隔对象和数组中的实体。

名/值对

JSON 名/值对由字段名称(在双引号内)组成,后跟冒号,然后是值。

例如:

{"firstName":"John", "empid":45611}
Copy

支持的数据类型

名/值对中的值可以是:

  • 数字(整数或浮点)

  • 字符串(在双引号内)

  • 布尔(true 或 false)

  • 数组(在方括号内)

  • 对象(在大括号内)

  • Null

对象

JSON 对象写在大括号内。对象可以包含多个名/值对,用逗号分隔。例如:

{"firstName":"John", "lastName":"Doe"}
Copy

数组

JSON 数组写在方括号内。数组可以包含多个对象,用逗号分隔。例如:

{"employees":[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
  ]
}
Copy

JSON 文档示例

FILE NAME: json_sample_data1

包含一个有 3 个简单员工记录(对象)的数组:

{"root":[{"employees":[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]}]}
Copy

FILE NAME: json_sample_data2

包含一个数组,其中有 3 个员工记录(对象)及其关联的相依数据(孩子、孩子的姓名和年龄、员工居住的城市,以及员工在这些城市居住的年限):

{"root":
   [
    { "kind": "person",
      "fullName": "John Doe",
      "age": 22,
      "gender": "Male",
      "phoneNumber":
        {"areaCode": "206",
         "number": "1234567"},
      "children":
         [
           {
             "name": "Jane",
             "gender": "Female",
             "age": "6"
           },
           {
              "name": "John",
              "gender": "Male",
              "age": "15"
           }
         ],
      "citiesLived":
         [
            {
               "place": "Seattle",
               "yearsLived": ["1995"]
            },
            {
               "place": "Stockholm",
               "yearsLived": ["2005"]
            }
         ]
      },
      {"kind": "person", "fullName": "Mike Jones", "age": 35, "gender": "Male", "phoneNumber": { "areaCode": "622", "number": "1567845"}, "children": [{ "name": "Earl", "gender": "Male", "age": "10"}, {"name": "Sam", "gender": "Male", "age": "6"}, { "name": "Kit", "gender": "Male", "age": "8"}], "citiesLived": [{"place": "Los Angeles", "yearsLived": ["1989", "1993", "1998", "2002"]}, {"place": "Washington DC", "yearsLived": ["1990", "1993", "1998", "2008"]}, {"place": "Portland", "yearsLived": ["1993", "1998", "2003", "2005"]}, {"place": "Austin", "yearsLived": ["1973", "1998", "2001", "2005"]}]},
      {"kind": "person", "fullName": "Anna Karenina", "age": 45, "gender": "Female", "phoneNumber": { "areaCode": "425", "number": "1984783"}, "citiesLived": [{"place": "Stockholm", "yearsLived": ["1992", "1998", "2000", "2010"]}, {"place": "Russia", "yearsLived": ["1998", "2001", "2005"]}, {"place": "Austin", "yearsLived": ["1995", "1999"]}]}
    ]
}
Copy

Avro

什么是 Avro?

Avro 是一个开源数据序列化和 RPC 框架,最初是为与 Apache Hadoop 搭配使用而开发的。它利用 JSON 中定义的架构,以紧凑的二进制格式生成序列化数据。序列化数据可发送到任何目标(即应用程序或编程),还可以在目标上轻松反序列化,因为架构包含在数据中。

Avro 架构由 JSON 字符串、对象或数组组成,用于定义架构类型和架构类型的数据属性(字段名称、数据类型等)。属性因架构类型而异。支持数组、映射等复杂数据类型。

Snowflake 将 Avro 数据读取到单个 VARIANT 列中。可以像查询 JSON 数据一样,使用类似的命令和函数查询 VARIANT 列中的数据。

有关更多信息,请参阅 avro.apache.org (http://avro.apache.org)。

Avro 架构示例

{
 "type": "record",
 "name": "person",
 "namespace": "example.avro",
 "fields": [
     {"name": "fullName", "type": "string"},
     {"name": "age",  "type": ["int", "null"]},
     {"name": "gender", "type": ["string", "null"]}
     ]
}
Copy

ORC

什么是 ORC?

ORC (Optimized Row Columnar) 是一种用于存储 Hive 数据的二进制格式。与早期的 Hive 文件格式相比,ORC 旨在实现高效压缩并改进读取、写入和处理数据的性能。有关 ORC 的更多信息,请参阅 https://orc.apache.org/ (https://orc.apache.org//)。

Snowflake 将 ORC 数据读取到单个 VARIANT 列中。可以像查询 VARIANT 数据一样,使用类似的命令和函数查询 JSON 列中的数据。

还可以使用 CREATE TABLE AS SELECT 语句将暂存的 ORC 文件中的列提取到单独的表列中。

备注

  • 将 Map 数据反序列化为一个对象数组,例如:

    "map": [{"key": "chani", "value": {"int1": 5, "string1": "chani"}}, {"key": "mauddib", "value": {"int1": 1, "string1": "mauddib"}}]
    
    Copy
  • 将 Union 数据反序列化为单个对象,例如:

    {"time": "1970-05-05 12:34:56.197", "union": {"tag": 0, "value": 3880900}, "decimal": 3863316326626557453.000000000000000000}
    
    Copy

已加载到 VARIANT 列中的 ORC 数据示例

+--------------------------------------+
| SRC                                  |
|--------------------------------------|
| {                                    |
|   "boolean1": false,                 |
|   "byte1": 1,                        |
|   "bytes1": "0001020304",            |
|   "decimal1": 12345678.654745,       |
|   "double1": -1.500000000000000e+01, |
|   "float1": 1.000000000000000e+00,   |
|   "int1": 65536,                     |
|   "list": [                          |
|     {                                |
|       "int1": 3,                     |
|       "string1": "good"              |
|     },                               |
|     {                                |
|       "int1": 4,                     |
|       "string1": "bad"               |
|     }                                |
|   ]                                  |
| }                                    |
+--------------------------------------+
Copy

Parquet

什么是 Parquet?

Parquet 是一种压缩、高效的列式数据表示形式,专为 Hadoop 生态系统中的项目而设计。该文件格式支持复杂的嵌套数据结构,使用 Dremel 记录粉碎和汇编算法。有关更多信息,请参阅 parquet.apache.org/docs/ (https://parquet.apache.org/docs/)。

备注

目前,Snowflake 支持使用 Parquet 编写器 v1 生成的 Parquet 文件架构。使用编写器 v2 生成的文件不支持加载数据。

Snowflake 将 Parquet 数据读取到单个 VARIANT 列中。可以像查询 JSON 数据一样,使用类似的命令和函数查询 VARIANT 列中的数据。

还可以使用 CREATE TABLE AS SELECT 语句将暂存的 Parquet 文件中的 select 列提取到单独的表列中。

Parquet 是一种二进制格式。无法提供 Parquet 文件示例。

已加载到 VARIANT 列中的 Parquet 数据示例

+------------------------------------------+
| SRC                                      |
|------------------------------------------|
| {                                        |
|   "continent": "Europe",                 |
|   "country": {                           |
|     "city": {                            |
|       "bag": [                           |
|         {                                |
|           "array_element": "Paris"       |
|         },                               |
|         {                                |
|           "array_element": "Nice"        |
|         },                               |
|         {                                |
|           "array_element": "Marseilles"  |
|         },                               |
|         {                                |
|           "array_element": "Cannes"      |
|         }                                |
|       ]                                  |
|     },                                   |
|     "name": "France"                     |
|   }                                      |
| }                                        |
+------------------------------------------+
Copy

XML

什么是 XML?

XML (eXtensible Markup Language) 是一种标记语言,它定义了一组用于编码文档的规则。它最初基于 SGML,这是为了使构成文档的结构和元素实现标准化而开发的另一种标记语言。

自推出以来,XML 已超越了最初对文档的关注,涵盖了广泛的用途,包括表示任意数据结构以及作为通信协议的基础语言。由于其可扩展性、多功能性和可用性,它已成为 Web 上最常用的数据交换标准之一。

XML 文档主要由以下结构组成:

  • 标签(用尖括号标识,< and >

  • 元素

元素通常由“start”标签和匹配的“end”标签组成,标签之间的文本构成元素的内容。元素也可以由“empty-element”标签组成,不包含“end”标签。“start”和“empty-element”标签可能包含某些属性,这些属性有助于定义元素的特征或元数据。

XML 文档示例

<?xml version="1.0"?>
<!DOCTYPE parts system "parts.dtd">
<?xml-stylesheet type="text/css" href="xmlpartsstyle.css"?>
<parts>
   <title>Automobile Parts &amp; Accessories</title>
   <part>
      <item>Spark Plugs</item>
      <partnum>A3-400</partnum>
      <price> 27.00</price>
   </part>
   <part>
      <item>Motor Oil</item>
      <partnum>B5-200</partnum>
      <price> 14.00</price>
   </part>
   <part>
      <item>Motor Oil</item>
      <partnum>B5-300</partnum>
      <price> 16.75</price>
   </part>
   <part>
      <item>Engine Coolant</item>
      <partnum>B6-120</partnum>
      <price> 19.00</price>
   </part>
   <part>
      <item>Engine Coolant</item>
      <partnum>B6-220</partnum>
      <price> 18.25</price>
   </part>
</parts>
Copy
语言: 中文