UDF.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. # coding:utf-8
  2. from odps.udf import annotate
  3. import json
  4. @annotate("string,string,string->bigint")
  5. class kv_in_json_array_position(object):
  6. def evaluate(self, json_array_str, key, value):
  7. if json_array_str is None or json_array_str == '':
  8. return -1
  9. index = 0
  10. json_array = json.loads(json_array_str)
  11. for json_item in json_array:
  12. if key in json_item and str(json_item[key]) == value:
  13. return index
  14. index += 1
  15. return -1
  16. @annotate("string,string,string->bigint")
  17. class kv_in_json_array_item(object):
  18. def evaluate(self, json_array_str, key, value):
  19. if json_array_str is None or json_array_str == '':
  20. return ""
  21. json_array = json.loads(json_array_str)
  22. for json_item in json_array:
  23. if key in json_item and str(json_item[key]) == value:
  24. return json.dumps(json_item)
  25. return ""
  26. @annotate("string->string")
  27. class json_array_path(object):
  28. def evaluate(self, json_str):
  29. if json_str is None or json_str == '':
  30. return None
  31. try:
  32. arr = []
  33. json_array = json.loads(json_str)
  34. for data in json_array:
  35. if 'creativeId' in data:
  36. arr.append(str(data['creativeId']))
  37. return ",".join(arr)
  38. except Exception:
  39. return "Internal error"