|
@@ -0,0 +1,48 @@
|
|
|
+# 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"
|