日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Python 3 UDTF讀取MaxCompute資源示例

本文為您介紹基于MaxCompute客戶端通過Python 3 UDTF讀取MaxCompute資源的使用示例。

前提條件

已安裝MaxCompute客戶端。更多安裝MaxCompute客戶端操作,請參見安裝并配置MaxCompute客戶端

UDTF的動態參數說明

Python UDTF函數簽名格式請參見函數簽名及數據類型

  • 您可以在參數列表中使用*,表示接受任意長度、任意類型的輸入參數。例如@annotate('double,*->string')表示接受第一個參數是DOUBLE類型,后接任意長度、任意類型的參數列表。此時,您需要自己編寫代碼判斷輸入的個數和參數類型,然后對它們進行相應的操作(您可以對比C語言里面的printf函數來理解此操作)。

    說明

    *用在返回值列表中時,表示的是不同的含義。

  • UDTF的返回值可以使用*,表示返回任意個STRING類型。返回值的個數與調用函數時設置的別名個數有關。例如@annotate("bigint,string->double,*"),調用方式是UDTF(x, y) as (a, b, c),此處as后面設置了三個別名,即abc。編輯器會認定a為DOUBLE類型(Annotation中返回值第一列的類型是給定的),bc為STRING類型。因為這里給出了三個返回值,所以UDTF在調用forward時,forward必須是長度為3的數組,否則會出現運行時報錯。

    說明

    這種錯誤無法在編譯時報出,因此UDTF的調用者在SQL中設置alias個數時,必須遵循該UDTF定義的規則。由于聚合函數的返回值個數固定是1,所以這個功能對UDAF來說并無意義。

UDTF代碼示例

  • 讀取MaxCompute資源代碼示例。

    from odps.udf import annotate
    from odps.udf import BaseUDTF
    from odps.distcache import get_cache_file
    from odps.distcache import get_cache_table
    @annotate('string -> string, bigint')
    class UDTFExample(BaseUDTF):
        """讀取資源文件和資源表里的pageid、adid_list,生成dict
        """
        def __init__(self):
            import json
            cache_file = get_cache_file('test_json.txt')
            self.my_dict = json.load(cache_file)
            cache_file.close()
            records = list(get_cache_table('table_resource1'))
            for record in records:
                self.my_dict[record[0]] = record[1]
        """輸入pageid,輸出pageid以及它對應的所有adid
        """
        def process(self, pageid):
            for adid in self.my_dict[pageid]:
                self.forward(pageid, adid)
  • 動態參數代碼示例。

    from odps.udf import annotate
    from odps.udf import BaseUDTF
    import json
    @annotate('string,*->string,*')
    class JsonTuple(BaseUDTF):
        def process(self, *args):
            length = len(args)
            result = [None] * length
            try:
                obj = json.loads(args[0])
                for i in range(1, length):
                    result[i] = str(obj.get(args[i]))
            except Exception as err:
                result[0] = str(err)
                for i in range(1, length):
                    result[i] = None
            self.forward(*result)

    以上UDTF示例中,返回值個數會根據輸入參數的個數來決定。輸出參數中的第一個參數是一個JSON文本,后面的參數需要從JSON中根據Key進行解析。返回值中的第一個返回值是解析JSON過程中的出錯信息,如果沒有出錯,則會根據輸入的Key依次輸出從JSON中解析出來的內容,使用示例如下。

    -- 根據輸入參數的個數定制輸出別名個數。
    SELECT my_json_tuple(json, 'a', 'b') as (exceptions, a, b) FROM jsons;
    
    -- 變長部分可以一列都沒有。
    SELECT my_json_tuple(json) as exceptions FROM jsons;
    
    -- 下面這個SQL會出現運行時錯誤,因為別名個數與實際輸出個數不符。
    -- 注意編譯時無法發現此錯誤。
    SELECT my_json_tuple(json, 'a', 'b') as (exceptions, a, b, c) FROM jsons;

操作步驟

  1. UDTF代碼示例保存為py_udtf_example.py文件,放置于MaxCompute客戶端的bin目錄中。

  2. 登錄MaxCompute客戶端創建資源表table_resource1和內部表tmp1(后續執行DML操作寫入的目標表)并插入數據,準備資源文件test_json.txt并放置于MaxCompute客戶端的bin目錄中。

    更多登錄MaxCompute客戶端操作,請參見安裝并登錄MaxCompute本地客戶端。建表、插入數據命令及資源文件內容示例如下:

    • 創建資源表table_resource1,并插入數據。

      create table if not exists table_resource1 (pageid string, adid_list array<int>);
      insert into table table_resource1 values("contact_page2",array(2,3,4)),("contact_page3",array(5,6,7));
      說明

      由于table_resource1中adid_list字段數據類型為ARRAY,讀取表資源時需要在Session級別執行set odps.sql.python.version=cp37;命令開啟Python 3來支持讀取ARRAY類型數據。

    • 創建內部表tmp1,并插入數據。

      create table if not exists tmp1 (pageid string);
      insert into table tmp1 values ("front_page"),("contact_page1"),("contact_page3");
    • 資源文件test_json.txt的內容如下。

      {"front_page":[1, 2, 3], "contact_page1":[3, 4, 5]}
  3. 通過MaxCompute客戶端,將py_udtf_example.py文件、test_json.txt和表table_resource1添加為MaxCompute的資源。

    更多添加資源信息,請參見添加資源。命令示例如下。

    add py py_udtf_example.py;
    add file test_json.txt;
    add table table_resource1 as table_resource1;
  4. 在MaxCompute客戶端上創建UDTF函數my_udtf。

    更多創建函數信息,請參見注冊函數。命令示例如下。

    create function my_udtf as 'py_udtf_example.UDTFExample' using 'py_udtf_example.py, test_json.txt, table_resource1';
  5. 在MaxCompute客戶端上執行SQL命令調用新創建的UDTF。

    命令示例如下:

    • 示例1:單純使用UDTF函數運行SQL。

      select my_udtf(pageid) as (pageid, adid) from tmp1;

      返回結果如下。

      +------------+------------+
      | pageid     | adid       |
      +------------+------------+
      | front_page | 1          |
      | front_page | 2          |
      | front_page | 3          |
      | contact_page1 | 3          |
      | contact_page1 | 4          |
      | contact_page1 | 5          |
      | contact_page3 | 5          |
      | contact_page3 | 6          |
      | contact_page3 | 7          |
      +------------+------------+
    • 示例2:對示例1中的命令改寫,結合Lateral View運行SQL。

      select pageid, adid from tmp1 lateral view my_udtf(pageid) adTable as udtf_pageid, adid;

      返回結果如下。

      +--------+------------+
      | pageid | adid       |
      +--------+------------+
      | front_page | 1          |
      | front_page | 2          |
      | front_page | 3          |
      | contact_page1 | 3          |
      | contact_page1 | 4          |
      | contact_page1 | 5          |
      | contact_page3 | 5          |
      | contact_page3 | 6          |
      | contact_page3 | 7          |
      +--------+------------+
    • 示例3:結合聚合函數和Lateral View運行SQL。

      select adid, count(1) as cnt
          from tmp1 lateral view my_udtf(pageid) adTable as udtf_pageid, adid
      group by adid;

      返回結果如下。

      +------------+------------+
      | adid       | cnt        |
      +------------+------------+
      | 1          | 1          |
      | 2          | 1          |
      | 3          | 2          |
      | 4          | 1          |
      | 5          | 2          |
      | 6          | 1          |
      | 7          | 1          |
      +------------+------------+