使用OBJECT TABLE处理非结构化数据

本文通过示例介绍如何使用Object Table访问数据湖存储中的非结构化数据及其元信息。

费用说明

  • 刷新OBJECT TABLE缓存数据,后付费模式基于外表的计费模式收费,输入数据量与OSS文件数量相关,与文件实际大小无关。

  • 查看OBJECT TABLE中的对象并过滤排序,后付费模式基于内表计费模式收费,本质是查询存储在MaxCompute中的Delta Table中的元数据信息。

  • 调用UDF获取PDF文本示例,后付费模式基于外表计费模式收费,输入的数据量与OSS文件实际大小有关。

可以通过元数据过滤来减少处理任务中对不需要的OSS目录中文件的读取。

计费详情请参见Object Table费用说明

前提条件

  • 已创建OSS Bucket。Bucket名称例如:object-table-bucket,新建目录名称:ot_openlake

  • 已完成上传解压后的非结构化数据unstruct data.zipOSS Bucketobject-table-bucketot_openlake目录下。

  • 创建MaxCompute项目,并开启Schema功能。例如:阿里云账号(主账号)的UID111740****241234,所属地域为华南1(深圳)region="cn-shengzhen",项目名称为lakehouse_yunqi_demo_sz

创建OBJECT TABLE

SET odps.namespace.schema=true; 
DROP TABLE IF EXISTS lakehouse_yunqi_demo_sz.default.ot_openlake_demo; 

CREATE OBJECT TABLE lakehouse_yunqi_demo_sz.default.ot_openlake_demo 
WITH serdeproperties ( 
 'odps.properties.rolearn'='acs:ram::111740****241234:role/aliyunodpsdefaultrole') 
LOCATION 'oss://oss-cn-shengzhen-internal.aliyuncs.com/object-table-bucket/ot_openlake/';

查看OBJECT TABLE

SET odps.namespace.schema=true;
SHOW TABLES;

返回结果如下。

111740****241234:ot_openlake_demo

查看OBJECT TABLE建表语句

SET odps.namespace.schema=true;
SHOW CREATE TABLE ot_openlake_demo;

返回结果如下。

CREATE OBJECT TABLE IF NOT EXISTS lakehouse_yunqi_demo_sz.`default`.ot_openlake_demo 
WITH SERDEPROPERTIES ( 
  'serialization.format'='1', 
  'odps.properties.rolearn'='acs:ram::111740****241234:role/aliyunodpsdefaultrole') 
LOCATION 'oss://oss-cn-shenzhen-internal.aliyuncs.com/object-table-bucket/ot_openlake/' 
TBLPROPERTIES ( 
  'last_modified_time'='1726564699', 
  'transient_lastDdlTime'='1726564699', 
  'metadata.cache.mode'='manual', 
  'metadata.staleness.seconds'='3600');

刷新OBJECT TABLE缓存数据

SET odps.namespace.schema=true; 
ALTER TABLE ot_openlake_demo REFRESH METADATA;

查看OBJECT TABLE中对象数量

SET odps.namespace.schema=true; 
SELECT COUNT(*) AS ROW_COUNT FROM ot_openlake_demo;

返回结果如下。

+---------+
|row_count|
+---------+
|4       |
+---------+

查询过滤排序数据

按大小和文件后缀过滤再排序。

SET odps.namespace.schema=true; 
SELECT key,size FROM ot_openlake_demo 
WHERE key LIKE '%.json' 
AND size  > 100 
ORDER BY size 
DESC limit 10; 

返回结果如下。

+-----------------+-------+
|key	            | size  |
+-----------------+-------+
|hex-char.json	  | 122   | 
+-----------------+-------+

调用UDF获取PDF文本

  1. 准备binary_pdf2text.pyUDF函数,试用工具包pdf_tools_cp37.tar.gz提取PDF中的文本数。

    -- 在控制台上传文件至maxcompute项目
    ADD py binary_pdf2text.py -f;
    ADD archive pdf_tools_cp37.tar.gz -f;
    
    -- 注册UDF函数
    CREATE FUNCTION pdf2text AS binary_pdf2text.ExtractPDFText 
      USING 'binary_pdf2text.py, pdf_tools_cp37.tar.gz' -f;
  2. 调用pdf2textUDF函数,将demoday.pdf中的内容提取成文本。更多GET_DATA_FROM_OSS函数操作详见查询对象内容进行业务计算

    SET odps.namespace.schema=true; 
    SET odps.sql.python.version=cp37; 
    SELECT key, size, get_json_object( 
      pdf2text( 
        key, 
        GET_DATA_FROM_OSS("lakehouse_yunqi_demo_sz.default.ot_openlake_demo", key) 
      ),'$.text.0' 
    ) AS text 
    FROM ot_openlake_demo 
    WHERE ends_with(cast(key as string), 'demoday.pdf') = true;

    返回结果如下。

    +------------+------------+------------+
    | key        | size       | text       |
    +------------+------------+------------+
    | demoday.pdf | 261567     | Simple Home Styling Simple Home Styling Easy Decorating To get started, just tap or click this placeholder text and begin typing. You 
    can view and edit this document on your Mac, iPad, iPhone, or on... 

相关文档