摘要:在之前的文章中,我們已經(jīng)介紹過(guò)怎樣在上對(duì)存儲(chǔ)在上的文本,音頻,圖像等格式的數(shù)據(jù),以及的數(shù)據(jù)進(jìn)行計(jì)算處理。外部表的必須與具體上存儲(chǔ)存儲(chǔ)數(shù)據(jù)的相符合。唯一不同的只是在內(nèi)部計(jì)算引擎將從上去讀取對(duì)應(yīng)的數(shù)據(jù)來(lái)進(jìn)行處理。
前言
MaxCompute作為使用最廣泛的大數(shù)據(jù)平臺(tái),內(nèi)部存儲(chǔ)的數(shù)據(jù)以EB量級(jí)計(jì)算。巨大的數(shù)據(jù)存儲(chǔ)量以及大規(guī)模計(jì)算下高性能數(shù)據(jù)讀寫(xiě)的需求,對(duì)于MaxCompute提出了各種高要求及挑戰(zhàn)。處在大數(shù)據(jù)時(shí)代,數(shù)據(jù)的來(lái)源多種多樣,開(kāi)源社區(qū)經(jīng)過(guò)十幾年的發(fā)展,百花齊放,各種各樣的數(shù)據(jù)格式不斷的出現(xiàn)。 我們的用戶也在各個(gè)場(chǎng)景上,通過(guò)各種計(jì)算框架,積累了各種不同格式的數(shù)據(jù)。怎樣將MaxCompute強(qiáng)大的計(jì)算能力開(kāi)放給這些使用開(kāi)源格式存儲(chǔ)沉淀下來(lái)的數(shù)據(jù),在MaxCompute上挖掘這些數(shù)據(jù)中的信息,是MaxCompute團(tuán)隊(duì)希望解決的問(wèn)題。
MaxCompute 2.0最近推出的非結(jié)構(gòu)化計(jì)算框架【公測(cè)階段】,旨在從存儲(chǔ)介質(zhì)和存儲(chǔ)格式兩個(gè)維度,打通計(jì)算與存儲(chǔ)的通道。 在之前的文章中,我們已經(jīng)介紹過(guò)怎樣在MaxCompute上對(duì)存儲(chǔ)在OSS上的文本,音頻,圖像等格式的數(shù)據(jù),以及TableStore(OTS)的KV數(shù)據(jù)進(jìn)行計(jì)算處理。在這里,則將介紹對(duì)于各種流行的開(kāi)源數(shù)據(jù)格式(ORC, PARQUET, SEQUENCEFILE, RCFILE, AVRO, TEXTFILE等等),怎樣將其存儲(chǔ)在OSS上面,并通過(guò)非結(jié)構(gòu)化框架在MaxCompute進(jìn)行處理。
本著不重造輪子的原則,對(duì)于絕大部分這些開(kāi)源數(shù)據(jù)格式的解析工作,在非結(jié)構(gòu)化框架中會(huì)直接調(diào)用開(kāi)源社區(qū)的實(shí)現(xiàn),并且無(wú)縫的與MaxCompute系統(tǒng)做對(duì)接。
1. 創(chuàng)建EXTERNAL TABLE來(lái)綁定OSS外部數(shù)據(jù)
MaxCompute非結(jié)構(gòu)化數(shù)據(jù)框架通過(guò)EXTERNAL TABLE的概念來(lái)提供MaxCompute與各種數(shù)據(jù)的聯(lián)通,與讀取OSS數(shù)據(jù)的使用方法類似,對(duì)OSS數(shù)據(jù)進(jìn)行寫(xiě)操作,首先要通過(guò)CREATE EXTERNAL TABLE語(yǔ)句創(chuàng)建出一個(gè)外部表,而在讀取開(kāi)源數(shù)據(jù)格式時(shí),創(chuàng)建外表的DDL語(yǔ)句格式如下:
DROP TABLE [IF EXISTS]; CREATE EXTERNAL TABLE [IF NOT EXISTS] ( ) [PARTITIONED BY (partition column schemas)] [ROW FORMAT SERDE " "] STORED AS LOCATION "oss://${accessKeyId}:${accessKeySecret}@${endpoint}/${bucket}/${userPath}/"
可以看到,這個(gè)語(yǔ)法與HIVE的語(yǔ)法是相當(dāng)接近的,而在這個(gè)CREATE EXTERNAL TABLE的ddl語(yǔ)句中,有如下幾點(diǎn)要說(shuō)明:
首先要特別說(shuō)明的是這里使用的是STORED AS的關(guān)鍵字,而不是普通非結(jié)構(gòu)化外表用的STORED BY關(guān)鍵字,這也是目前在讀取開(kāi)源兼容數(shù)據(jù)時(shí)獨(dú)有的。
外部表的
ROW FORMAT SERDE 并非必選選項(xiàng),只有在使用一些特殊的格式上,比如TEXTFILE時(shí)才需要使用。
STORED AS后面接的是文件格式名字, 比如 ORC/PARQUET/RCFILE/SEQUENCEFILE/TEXTFILE 等等。
最后還要提到的是,在上面這個(gè)例子中,我們?cè)贚OCATION上使用了OSS明文AK,這只適用于在用戶對(duì)于AK的保密性不敏感情況下使用。 對(duì)于數(shù)據(jù)安全比較敏感的場(chǎng)景,比如在多用戶場(chǎng)景或者彈外集群上,則推薦使用通過(guò)STS/RAM體系事先進(jìn)行鑒權(quán),從而避免使用明文AK。
1.1 范例1: 關(guān)聯(lián)OSS上存儲(chǔ)的PARQUET數(shù)據(jù)
現(xiàn)在再來(lái)看一個(gè)具體的例子,假設(shè)我們有一些PARQUET文件存放在一個(gè)OSS路徑上,每個(gè)文件都是PARQUET格式,存放著schema為16列(4列BINGINT, 4列DOUBLE, 8列STRING)的數(shù)據(jù),那么可以通過(guò)如下DDL語(yǔ)句來(lái)描述:
CREATE EXTERNAL TABLE tpch_lineitem_parquet ( l_orderkey bigint, l_partkey bigint, l_suppkey bigint, l_linenumber bigint, l_quantity double, l_extendedprice double, l_discount double, l_tax double, l_returnflag string, l_linestatus string, l_shipdate string, l_commitdate string, l_receiptdate string, l_shipinstruct string, l_shipmode string, l_comment string ) STORED AS PARQUET LOCATION "oss://${accessKeyId}:${accessKeySecret}@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/parquet_data/";
1.2 范例2:分區(qū)表關(guān)聯(lián)OSS上存儲(chǔ)的TEXTFILE數(shù)據(jù)
同樣的數(shù)據(jù),如果是每行以JSON格式,存儲(chǔ)成OSS上TEXTFILE文件;同時(shí),數(shù)據(jù)在OSS通過(guò)多個(gè)目錄組織,這時(shí)是可以使用MaxCompute分區(qū)表和數(shù)據(jù)關(guān)聯(lián),則可以通過(guò)如下DDL語(yǔ)句來(lái)描述:
CREATE EXTERNAL TABLE tpch_lineitem_textfile ( l_orderkey bigint, l_partkey bigint, l_suppkey bigint, l_linenumber bigint, l_quantity double, l_extendedprice double, l_discount double, l_tax double, l_returnflag string, l_linestatus string, l_shipdate string, l_commitdate string, l_receiptdate string, l_shipinstruct string, l_shipmode string, l_comment string ) PARTITIONED BY (ds string) ROW FORMAT serde "org.apache.hive.hcatalog.data.JsonSerDe" STORED AS TEXTFILE LOCATION "oss://${accessKeyId}:${accessKeySecret}@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/text_data/";
如果OSS表目錄下面的子目錄是以Partition Name方式組織,比如:
oss://${accessKeyId}:${accessKeySecret}@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/text_data/ds=20170102/" oss://${accessKeyId}:${accessKeySecret}@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/text_data/ds=20170103/" ...
則可以使用以下DDL語(yǔ)句ADD PARTITION:
ALTER TABLE tpch_lineitem_textfile ADD PARTITION(ds="20170102"); ALTER TABLE tpch_lineitem_textfile ADD PARTITION(ds="20170103");
如果OSS分區(qū)目錄不是按這種方式組織,或者根本不在表目錄下,比如:
oss://${accessKeyId}:${accessKeySecret}@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/text_data_20170102/; oss://${accessKeyId}:${accessKeySecret}@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/text_data_20170103/; ...
則可以使用以下DDL語(yǔ)句ADD PARTITION:
ALTER TABLE tpch_lineitem_textfile ADD PARTITION(ds="20170102") LOCATION "oss://${accessKeyId}:${accessKeySecret}@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/text_data_20170102/"; ALTER TABLE tpch_lineitem_textfile ADD PARTITION(ds="20170103") LOCATION "oss://${accessKeyId}:${accessKeySecret}@oss-cn-hangzhou-zmf.aliyuncs.com/bucket/text_data_20170103/"; ...
讀取以及處理 OSS 上面的開(kāi)源格式數(shù)據(jù)
對(duì)比上面的兩個(gè)范例,可以看出對(duì)于不同文件類型,只要簡(jiǎn)單修改STORED AS后的格式名。在接下來(lái)的例子中,我們將只集中描述對(duì)上面PARQUET數(shù)據(jù)對(duì)應(yīng)的外表(tpch_lineitem_parquet)的處理,如果要處理不同的文件類型,只要在DDL創(chuàng)建外表時(shí)指定是PARQUET/ORC/TEXTFILE/RCFILE/TEXTFILE即可,處理數(shù)據(jù)的語(yǔ)句則是一樣的。
2.1 直接讀取以及處理OSS上面的開(kāi)源數(shù)據(jù)
在創(chuàng)建數(shù)據(jù)外表后,直接對(duì)外表就可以進(jìn)行與普通MaxCompute表的操作,直接對(duì)存儲(chǔ)在OSS上的數(shù)據(jù)進(jìn)行處理,比如:
SELECT l_returnflag, l_linestatus, SUM(l_extendedprice*(1-l_discount)) AS sum_disc_price, AVG(l_quantity) AS avg_qty, COUNT(*) AS count_order FROM tpch_lineitem_parquet WHERE l_shipdate <= "1998-09-02" GROUP BY l_returnflag, l_linestatus;
可以看到,在這里tpch_lineitem_parquet這個(gè)外表被當(dāng)作一個(gè)普通的內(nèi)部表一樣使用。唯一不同的只是在MaxCompute內(nèi)部計(jì)算引擎將從OSS上去讀取對(duì)應(yīng)的PARQUET數(shù)據(jù)來(lái)進(jìn)行處理。
但是我們應(yīng)該強(qiáng)調(diào)的是,在這里直接使用外表,每次讀取的時(shí)候都需要涉及外部OSS的IO操作,并且MaxCompute系統(tǒng)本身針對(duì)內(nèi)部存儲(chǔ)做的許多高性能優(yōu)化都用不上了,所以性能上會(huì)有所損失。 所以如果是需要對(duì)數(shù)據(jù)進(jìn)行反復(fù)計(jì)算以及對(duì)計(jì)算的高效性比較敏感的場(chǎng)景上,我們推薦下面這種用法:先將數(shù)據(jù)導(dǎo)入MaxCompute內(nèi)部,再進(jìn)行計(jì)算。
注意,上面例子中的tpch_lineitem_textfile表,因?yàn)槭褂昧薘OW FORMAT + STORED AS,需要手動(dòng)設(shè)置flag(只使用STORED AS,odps.sql.hive.compatible默認(rèn)為TRUE),再進(jìn)行讀取,否則會(huì)有報(bào)錯(cuò)。
SELECT * FROM tpch_lineitem_textfile LIMIT 1; FAILED: ODPS-0123131:User defined function exception - Traceback: com.aliyun.odps.udf.UDFException: java.lang.ClassNotFoundException: com.aliyun.odps.hive.wrapper.HiveStorageHandlerWrapper
--需要手動(dòng)設(shè)置hive兼容flag
set odps.sql.hive.compatible=true; SELECT * FROM tpch_lineitem_textfile LIMIT 1; +------------+------------+------------+--------------+------------+-----------------+------------+------------+--------------+--------------+------------+--------------+---------------+----------------+------------+-----------+ | l_orderkey | l_partkey | l_suppkey | l_linenumber | l_quantity | l_extendedprice | l_discount | l_tax | l_returnflag | l_linestatus | l_shipdate | l_commitdate | l_receiptdate | l_shipinstruct | l_shipmode | l_comment | +------------+------------+------------+--------------+------------+-----------------+------------+------------+--------------+--------------+------------+--------------+---------------+----------------+------------+-----------+ | 5640000001 | 174458698 | 9458733 | 1 | 14.0 | 23071.58 | 0.08 | 0.06 | N | O | 1998-01-26 | 1997-11-16 | 1998-02-18 | TAKE BACK RETURN | SHIP | cuses nag silently. quick | +------------+------------+------------+--------------+------------+-----------------+------------+------------+--------------+--------------+------------+--------------+---------------+----------------+------------+-----------+
2.2 將OSS上的開(kāi)源數(shù)據(jù)導(dǎo)入MaxCompute,再進(jìn)行計(jì)算
首先創(chuàng)建一個(gè)與外部表schema一樣的內(nèi)部表tpch_lineitem_internal,然后將OSS上的開(kāi)源數(shù)據(jù)導(dǎo)入MaxCompute內(nèi)部表,以cFile格式存儲(chǔ)在MaxCompute內(nèi)部:
CREATE TABLE tpch_lineitem_internal LIKE tpch_lineitem_parquet; INSERT OVERWRITE TABLE tpch_lineitem_internal SELECT * FROM tpch_lineitem_parquet;
直接就可以對(duì)內(nèi)部表進(jìn)行同樣的操作:
SELECT l_returnflag, l_linestatus, SUM(l_extendedprice*(1-l_discount)) AS sum_disc_price, AVG(l_quantity) AS avg_qty, COUNT(*) AS count_order FROM tpch_lineitem_internal WHERE l_shipdate <= "1998-09-02" GROUP BY l_returnflag, l_linestatus;
通過(guò)這樣子將數(shù)據(jù)先導(dǎo)入系統(tǒng)的情況下,對(duì)同樣數(shù)據(jù)的計(jì)算就會(huì)更高效得多。
4. 結(jié)語(yǔ)
開(kāi)源的種種數(shù)據(jù)格式往往由各種數(shù)據(jù)處理生態(tài)產(chǎn)生,而MaxCompute非結(jié)構(gòu)化數(shù)據(jù)處理框架通過(guò)實(shí)現(xiàn)計(jì)算與存儲(chǔ)的互聯(lián),希望打通阿里云核心計(jì)算平臺(tái)與各種數(shù)據(jù)的通路。在這個(gè)基礎(chǔ)上,各種各樣依賴于不同數(shù)據(jù)格式的應(yīng)用,將能在MaxCompute計(jì)算平臺(tái)上實(shí)現(xiàn),后繼我們會(huì)對(duì)一些具體的這種應(yīng)用,比如基因計(jì)算等,再做一些具體的case study以及介紹。我們也歡迎有對(duì)開(kāi)源數(shù)據(jù)進(jìn)行處理分析的更多應(yīng)用,能在MaxCompute強(qiáng)大計(jì)算能力的基礎(chǔ)上開(kāi)花結(jié)果。
原文鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69592.html
摘要:作為阿里云大數(shù)據(jù)旗艦產(chǎn)品,的級(jí)別性能處理達(dá)到了全球領(lǐng)先性,被評(píng)為全球云端數(shù)據(jù)倉(cāng)庫(kù)領(lǐng)導(dǎo)者。天弘基金天弘基金旗下的余額寶,是中國(guó)規(guī)模最大的貨幣基金。場(chǎng)景二阿里云產(chǎn)品消費(fèi)賬單分析準(zhǔn)備工作完成案例中準(zhǔn)備工作步驟。 摘要: 一、 MaxCompute是什么 你的OSS數(shù)據(jù)是否作堆積在一旁沉睡已久存儲(chǔ)成本變?yōu)槠髽I(yè)負(fù)擔(dān)你是否想喚醒沉睡的數(shù)據(jù)驅(qū)動(dòng)你的業(yè)務(wù)前行MaxCompute可以幫助你高效且低成本的...
摘要:本文對(duì)使用分析文本數(shù)據(jù)的實(shí)踐過(guò)程中遇到的一些問(wèn)題和優(yōu)化經(jīng)驗(yàn)進(jìn)行了總結(jié)。作為前提,讀者需要詳細(xì)了解讀取文本數(shù)據(jù)的一些基礎(chǔ)知識(shí),對(duì)這篇官方文檔訪問(wèn)非結(jié)構(gòu)化數(shù)據(jù)最好有過(guò)實(shí)踐經(jīng)驗(yàn)。這需要針對(duì)含有非英文字符的文本數(shù)據(jù)做一些特殊處理。 摘要: 1. 本文背景 很多行業(yè)的信息系統(tǒng)中,例如金融行業(yè)的信息系統(tǒng),相當(dāng)多的數(shù)據(jù)交互工作是通過(guò)傳統(tǒng)的文本文件進(jìn)行交互的。此外,很多系統(tǒng)的業(yè)務(wù)日志和系統(tǒng)日志由于各種...
閱讀 3050·2021-11-22 09:34
閱讀 2518·2021-09-30 09:47
閱讀 1455·2021-09-03 10:32
閱讀 3725·2021-08-16 10:49
閱讀 1796·2019-08-30 15:55
閱讀 2470·2019-08-30 15:52
閱讀 3331·2019-08-30 15:44
閱讀 1364·2019-08-30 15:44