123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- # coding:utf-8
- from odps.udf import annotate
- import json
- @annotate("string,string,string->bigint")
- class kv_in_json_array_position(object):
- def evaluate(self, json_array_str, key, value):
- if json_array_str is None or json_array_str == '':
- return -1
- index = 0
- json_array = json.loads(json_array_str)
- for json_item in json_array:
- if key in json_item and str(json_item[key]) == value:
- return index
- index += 1
- return -1
- @annotate("string,string,string->bigint")
- class kv_in_json_array_item(object):
- def evaluate(self, json_array_str, key, value):
- if json_array_str is None or json_array_str == '':
- return ""
- json_array = json.loads(json_array_str)
- for json_item in json_array:
- if key in json_item and str(json_item[key]) == value:
- return json.dumps(json_item)
- return ""
- @annotate("string->string")
- class json_array_path(object):
- def evaluate(self, json_str):
- if json_str is None or json_str == '':
- return None
- try:
- arr = []
- json_array = json.loads(json_str)
- for data in json_array:
- if 'creativeId' in data:
- arr.append(str(data['creativeId']))
- return ",".join(arr)
- except Exception:
- return "Internal error"
|