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

本文为您介绍如何使用Object Table对数据湖存储中的非结构化数据及其元信息进行访问。

使用说明

  • 您可以通过本文相关示例来直接试用Object Table访问数据湖存储中非结构化数据及其元信息能力。

  • 您也可以在DataWorks控制台,通过DataWorks Gallery中的示例基于OpenLakeObject Table的非结构化数据处理来完整的试用Object Table的能力。

前提条件

  • 已完成OSS Bucket的创建,Bucket名称如:object-table-bucket,新建目录名称:ot_openlake

  • 已完成上传非结构化数据unstruct data.zip(解压后文件)至OSS Bucketobject-table-bucketot_openlake目录下。

  • 已完成MaxCompute云栖邀测项目的创建。例如:阿里云账号(主账号)的UID111740****241234,所属地域为华南1(深圳)region="cn-shengzhen",项目名称为lakehouse_yunqi_demo_sz。详情请参见创建云栖邀测项目

费用说明

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

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

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

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

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

创建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 jar 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...