Lance外部表(Beta)

更新时间:
复制为 MD 格式

本文介绍如何创建Lance外部表以及如何通过MaxCompute访问Lance外部表。

Lance是一种AI原生的多模态数据湖格式。MaxCompute支持通过创建Lance外部表与存储于OSS上的Lance表目录建立映射关系,并访问其中的数据。

适用范围

  • 单个文件大小不能超过2GB,如果文件过大,建议拆分。

  • MaxCompute需要与OSS部署在同一地域。

  • Lance外部表不支持分区能力

  • Lance外部表不支持自动跟随lance文件schema变更而调整schema。

  • 不支持对Lance外部表设置cluster属性,不支持设置主键。

  • 不支持对Lance外部表执行UPDATE/DELETE操作。

  • Lance外部表暂不支持查询回溯历史版本的数据等特性。

创建外部表

语法结构

CREATE EXTERNAL TABLE  [if NOT EXISTS] <mc_oss_extable_name>
(
  <col_name> <data_type>,
  ...
)
[COMMENT <table_comment>]
com.aliyun.odps.common.table.lance.LanceStorageHandler
[WITH serdeproperties (
  ['<property_name>'='<property_value>',...]
)]
LOCATION '<oss_location>' 
;

参数说明

  • 普通外表需指定Lance Data Schema,即表列名及数据类型信息,且该信息不会随Lance Data Schema evolution自动更新。

  • 普通外表可以指定一个空目录。第一次写数据,按照指定Schema创建Lance Data Schema。

  • 公共参数:公共参数说明请参见基础语法参数说明

写入数据

  • MaxCompute写入语法详情,请参见语法说明

  • 写入 Lance 外部表前,必须执行 SET odps.service.mode=off; 关闭在线模式。在线模式下不支持写入。

SET odps.service.mode=off;

-- 追加数据
INSERT INTO <table_name> VALUES (<value_1>, <value_2>, ...);

-- 覆盖写入
INSERT OVERWRITE TABLE <table_name> VALUES (<value_1>, <value_2>, ...);

查询分析

其他 DDL

  • 查询建表语句

    SHOW CREATE TABLE <table-name>;
  • 查看表详情

    DESC [EXTENDED] <table-name>;

使用示例

以下示例创建一张 Lance 外部表,写入一行数据并将其查询出来。

在 与 MaxCompute 项目相同地域 的 OSS Bucket 中,准备一个独立目录用于存放 Lance 表,例如 oss://<endpoint>/lancetable-demo/lance_table/image.lance/

创建外部表

CREATE EXTERNAL TABLE IF NOT EXISTS mc_oss_lance_external
(
    id      BIGINT  COMMENT '行 ID',
    name    STRING  COMMENT '图片文件名',
    image   BINARY  COMMENT '图片内容或描述'
)
COMMENT 'Lance 外部表示例'
STORED BY 'com.aliyun.odps.common.table.lance.LanceStorageHandler'WITH SERDEPROPERTIES (
    'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
)
LOCATION 'oss://oss-cn-<region>-internal.aliyuncs.com/lancetable-demo/lance_table/image.lance/';

写入数据

SET odps.service.mode=off;

INSERT INTO mc_oss_lance_external VALUES (
    1,
    'test1.jpg',
    CAST('今天天气真好,心情很不错!阳光明媚,适合出去散步。' AS BINARY)
);

查询数据

SELECT * FROM mc_oss_lance_external;

-- 返回结果如下:
+------------+------------+------------+
| image_id   | image_name | image      | 
+------------+------------+------------+
| 1          | test1.jpg  | =20=E4=BB**| 
+------------+------------+------------+

-- 通过CAST函数查看
SELECT CAST(image AS STRING) FROM mc_oss_lance_external;

-- 返回结果如下:
+------------+------------+------------+
| image_id   | image_name | image      | 
+------------+------------+------------+
| 1          | test1.jpg  |  今天天气真好,心情很不错!阳光明媚,适合出去散步。 | 
+------------+------------+------------+

支持数据类型

MaxCompute数据类型详情请参见1.0数据类型版本2.0数据类型版本

Lance(Arrow) 数据类型

MaxCompute 数据类型

是否支持读

是否支持写

Boolean

BOOLEAN

支持

支持

Binary

BINARY

支持

支持

FixedBinary

BINARY

不支持

不支持

LargeBinary (Blob)

BINARY

不支持

不支持

Int (bitwidth=8)

TINYINT

支持

支持

Int (bitwidth=16)

SMALLINT

支持

支持

Int (bitwidth=32)

INT

支持

支持

Int (bitwidth=64)

BIGINT

支持

支持

FloatingPoint (precision=HALF/FLOAT) 

FLOAT

支持

支持

FloatingPoint (precision=DOUBLE) 

DOUBLE

支持

支持

Decimal

DECIMAL(precision, scale)

支持

支持

Date

DATE

支持

支持

Timestamp (timezone = null)

TIMESTAMP_NTZ

支持

支持

Timestamp (timezone = null)

说明

对于普通Lance外表,MaxComputeTIMESTAMPLance会映射为Timestamp(timezone=null)类型,即MaxCompute采用无时区类型来承载Arrow Timestamp Type中表示的local时区。若读表时想展示为有时区,可通过时区配置来设置,详情见时区配置操作

TIMESTAMP

支持

支持

Timestamp (timezone != null)

不支持

不支持

不支持

Utf8

STRING

支持

支持

Struct

Struct

不支持

不支持

List

Array

不支持

不支持

Fixed-Size List

Array

不支持

不支持