文档首页 > > SQL语法参考> 批作业SQL语法> 数据类型> 复杂数据类型

复杂数据类型

分享
更新时间: 2019/12/23 GMT+08:00

Spark SQL支持复杂数据类型,如表1所示。

表1 复杂数据类型

数据类型

描述

ARRAY

一组有序字段,所有字段的数据类型必须相同。

MAP

一组无序的键/值对。键的类型必须是原生数据类型,值的类型可以是原生数据类型或复杂数据类型。同一个MAP键的类型必须相同,值的类型也必须相同。

STRUCT

一组命名的字段,字段的数据类型可以不同。

使用限制

  • CSV格式数据不支持复杂数据类型。
  • MAP数据类型建表必须指定schema,且不支持date、short、timestamp数据类型。
  • 对于JSON格式OBS表,MAP的键类型只支持STRING类型。
  • 由于MAP类型的键不能为NULL,MAP键不支持对插入数据进行可能出现NULL值类型之间的隐式转换,如:STRING类型转换为其他原生类型、FLOAT类型转换为TIMESTAMP类型、其他原生类型转换为DECIMAL类型等。
  • STRUCT数据类型不支持double,boolean数据类型。

ARRAY示例

创建表“array_test”,将“id”参数定义为“ARRAY<INT>”数据类型,“name”参数定义为“STRING”数据类型。然后将已存在的文本“array_test.txt”导入“array_test”中。操作如下:

  1. 创建表。

    CREATE TABLE array_test(name STRING, id ARRAY<INT>)

    ROW FORMAT DELIMITED

    FIELDS TERMINATED BY ','

    COLLECTION ITEMS TERMINATED BY ':';

  2. 导入数据。

    “array_test.txt”文件路径为“/opt/array_test.txt”,文件内容如下所示:

    100,1:2:3:4
    101,5:6
    102,7:8:9:10

    执行如下命令导入数据。

    LOAD DATA LOCAL INPATH '/opt/array_test.txt' INTO TABLE array_test;

  3. 查询结果。

    “array_test”表中的所有数据:

    SELECT * FROM array_test;

    100 [1,2,3,4]
    101 [5,6]
    102 [7,8,9,10]

    “array_test”表中id数组第0个元素的数据。

    SELECT id[0] FROM array_test;

    1
    5
    7

MAP示例

创建表“map_test”,将“score”参数定义为“map<STRING,INT>)”数据类型(键为STRING类型,值为INT类型),然后将已存在的文本“map_test.txt”导入至“map_test”中。操作如下:

  1. 创建表。

    CREATE TABLE map_test(id STRING, score map<STRING,INT>)

    ROW FORMAT DELIMITED

    FIELDS TERMINATED BY '|'

    COLLECTION ITEMS TERMINATED BY ','

    MAP KEYS TERMINATED BY ':';

  2. 导入数据。

    “map_test.txt”文件路径为“/opt/map_test.txt”,文件内容如下所示:

    1|Math:90,English:89,Physics:86
    2|Math:88,English:90,Physics:92
    3|Math:93,English:93,Physics:83

    执行如下命令导入数据:

    LOAD DATA LOCAL INPATH '/opt/map_test.txt' INTO TABLE map_test;

  3. 查询结果。

    查询“map_test”表里的所有数据。

    SELECT * FROM map_test;

    1 {"English":89,"Math":90,"Physics":86}
    2 {"English":90,"Math":88,"Physics":92}
    3 {"English":93,"Math":93,"Physics":83}

    查询“map_test”表中的数学成绩。

    SELECT id, score['Math'] FROM map_test;

    190
    288
    393

STRUCT示例

创建表“struct_test”,将info定义为“STRUCT<name:STRING, age:INT>”数据类型(由name和age构成的字段,其中name为STRING类型,age为INT类型)。然后将已存在的文本“struct_test.txt”导入至“struct_test”表中。操作如下:

  1. 创建表。

    CREATE TABLE struct_test(id INT, info STRUCT<name:STRING,age:INT>)

    ROW FORMAT DELIMITED

    FIELDS TERMINATED BY ','

    COLLECTION ITEMS TERMINATED BY ':';

  2. 导入数据。

    “struct_test.txt”文件路径为“/opt/struct_test.txt”,文件内容如下所示:

    1,Lily:26
    2,Sam:28
    3,Mike:31
    4,Jack:29

    执行如下命令导入数据:

    LOAD DATA LOCAL INPATH '/opt/struct_test.txt' INTO TABLE struct_test;

  3. 查询结果。

    查询“struct_test”表中的所有数据。

    SELECT * FROM struct_test;

    1 {"name":"Lily","age":26}
    2 {"name":"Sam","age":28}
    3 {"name":"Mike","age":31}
    4 {"name":"Jack","age":29}

    查询“struct_test”表中姓名和年龄。

    SELECT id,info.name,info.age FROM struct_test;

    1 Lily 26
    2 Sam 28
    3 Mike 31
    4 Jack 29
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区