функция regex_replace пропускает все, что идет после нулевого значения

#json #hive #hiveql #regexp-replace #json-extract

#json #улей #hiveql #регулярное выражение-замена #json-извлечение

Вопрос:

В моей таблице hive «ticket_full» у меня есть столбец типа json с именем «service_id», который я хотел бы извлечь в 3 столбца, примерно так

 [{"position":"1","typeid":"ROUTNAME","value":"PWAW13197"},{"position":"2","typeid":"CDCNAME","value":null},{"position":"3","typeid":"SVCNAME","value":"Business"},{"position":"4","typeid":"USID","value":"FI021MLQE4"}]

[{"position":"1","typeid":"ROUTNAME","value":"KHLA30076"},{"position":"2","typeid":"CDCNAME","value":"eff-e-rjh-sw-cs2"},{"position":"3","typeid":"SVCNAME","value":"Managed LAN"},{"position":"4","typeid":"USID","value":"SA00BNGH0E"}]

[{"position":"1","typeid":"NUMLIAPTT","value":"0492212984"},{"position":"2","typeid":null,"value":null},{"position":"3","typeid":null,"value":null},{"position":"4","typeid":null,"value":null}]
  

Я использовал приведенный ниже код:

 SELECT get_json_object(single_json_table.identifiant_produit, '$.position') AS position,
  get_json_object(single_json_table.identifiant_produit, '$.typeid') AS typeid,
  get_json_object(single_json_table.identifiant_produit, '$.value') AS value
  FROM   
(SELECT explode(split(regexp_replace(substr(serviceid, 2, length(serviceid)-2),
            '"},\{"', '"},,,,{"'), ',,,,')  ) as identifiant_produit 
  FROM ticket_full) single_json_table

  

это работает, но каждый раз, когда значение равно NULL, оно игнорирует то, что следует, и переходит к следующему полю:
пример:

введите описание изображения здесь

Кто-нибудь знает, как это исправить, пожалуйста?

Ответ №1:

Это потому, что у null нет двойных кавычек, и вы заменяете это '"},\{"' на this '"},,,,{"'

Попробуйте удалить двойные кавычки перед } в шаблоне регулярных выражений и соответственно заменить строку, тогда она будет работать и со значениями в кавычках, и с нулевыми значениями:

 split(regexp_replace(substr(serviceid, 2, length(serviceid)-2),
            '},\{"', '},,,,{"'), ',,,,')