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

UDF示例:獲取字符串(不含分隔符)Value

本文為您介紹如何分別通過Java UDF和Python UDF實現獲取不包含分隔符的鍵值對字符串中指定Key對應的Value值。

命令說明

本示例將注冊一個名稱為UDF_EXTRACT_KEY_VALUE的自定義函數,下面對命令格式和入參進行說明。

  • 命令格式:

    string UDF_EXTRACT_KEY_VALUE(string <s>, string <split1>, string <split2>, string <keyname>) 
  • 命令功能:

    在字符串s中使用split1分割出鍵值對后,再根據split2分割鍵值對獲得鍵和值,最后返回鍵keyname對應的值。

    說明

    該UDF不適用于字符串本身包含分隔符的情況,如果需要處理該情況請使用獲取字符串(含分隔符)Value示例

  • 參數說明:

    • s:源字符串,STRING類型,必填。

    • split1:通過split1分割出鍵值對,STRING類型,必填。

    • split2:對分割出來的鍵值對使用split2進行分割,STRING類型,必填。

    • keyname:待獲取值所對應的鍵名稱,STRING類型,必填。

開發和使用步驟

1. 代碼開發

Java UDF 代碼示例

package com.aliyun.rewrite; //package名稱,可以根據您的情況定義。
import com.aliyun.odps.udf.UDF;

import java.util.HashMap;
import java.util.Map;

public class ExtractKeyValue extends UDF{
    private static final int KEY_VALUE_LENGTH = 2;

    /**
     * 使用split1分割出鍵值對后,再根據split2分割鍵值對
     * @param str     源字符串
     * @param split1  分割出鍵值對的標識
     * @param split2  分割出key value的標識
     * @param keyname 目標key名稱
     * @return 目標value
     */
    public String evaluate(String str, String split1, String split2, String keyname) {
        try {
            // 通過split1分割出鍵值對
            if (str == null || "".equals(str)) {
                return null;
            }
            Map<String, String> keyValueCache = new HashMap<>(8);
            String[] extractedKeyValues = str.split(split1);

            // 對分割出來的鍵值對使用split2進行進一步分割
            for (String keyValue : extractedKeyValues) {
                storeKeyValue(keyValueCache, keyValue, split2);
            }

            // 獲取目標key的value
            return keyValueCache.get(keyname);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 使用split對鍵值對進行分割,將分割后的結果緩存到keyValueCache中
     *
     * @param keyValueCache 分割后的鍵值對緩存
     * @param keyValue      待分割的鍵值對
     * @param split         分割符
     */
    private void storeKeyValue(Map<String, String> keyValueCache, String keyValue, String split) {
        if (keyValue == null || "".equals(keyValue)) {
            return;
        }
        String[] keyValueArr = keyValue.split(split);
        if (keyValueArr.length == KEY_VALUE_LENGTH) {
            keyValueCache.put(keyValueArr[0], keyValueArr[1]);
        }
    }
}

使用Java語言編寫UDF代碼必須繼承UDF類,本例中evaluate方法定義了四個string類型的入參和string類型的返回值,輸入參數和返回值的數據類型將作為SQL語句中UDF的函數簽名Signature,其他代碼規范和要求請參考:UDF開發規范與通用流程(Java)

Python3 UDF 代碼示例

from odps.udf import annotate


@annotate("string,string,string,string->string")
class ExtractKeyValue(object):
    def evaluate(self, s, split1, split2, keyname):
        if not s:
            return None
        # 使用 split1 分割出鍵值對,再使用split2分割
        key_value_cache = dict(kv.split(split2) for kv in s.split(split1) if kv)
        # 獲取目標 key 的 value
        return key_value_cache.get(keyname)

MaxCompute默認使用Python 2,可以在Session級別使用命令set odps.sql.python.version=cp37開啟Python 3。更多python3 UDF規范請參考:UDF開發規范與通用流程(Python3)

Python2 UDF 代碼示例

#coding:utf-8
from odps.udf import annotate


@annotate("string,string,string,string->string")
class ExtractKeyValue(object):
    def evaluate(self, s, split1, split2, keyname):
        if not s:
            return None
        # 使用 split1 分割出鍵值對,再使用split2分割
        key_value_cache = dict(kv.split(split2) for kv in s.split(split1) if kv)
        # 獲取目標 key 的 value
        return key_value_cache.get(keyname)

當Python 2代碼中出現中文字符時,運行程序會報錯,必須在代碼頭部增加編碼聲明。固定聲明格式為#coding:utf-8# -*- coding: utf-8 -*-,二者等效。更多python2 UDF規范請參考:UDF開發規范與通用流程(Python2)

2. 上傳資源和注冊函數

完成UDF代碼開發和調試之后,將資源上傳至MaxCompute并注冊函數,本示例注冊函數名:UDF_EXTRACT_KEY_VALUE。Java UDF上傳資源與注冊函數詳情步驟請參見:打包、上傳及注冊,Python UDF請參見:上傳及注冊

3. 使用示例

成功注冊UDF后,執行以下命令,從鍵值對字符串中獲取鍵為name的值。

set odps.sql.python.version=cp37; -- python3 UDF需要使用該命令開啟python3
SELECT UDF_EXTRACT_KEY_VALUE('name:zhangsan;age:21;',';',':','name');

執行結果如下:

+----------+
| _c0      |
+----------+
| zhangsan |
+----------+