Как сравнить два столбца с разными группами типов данных - PullRequest
1 голос
/ 04 октября 2019

Это расширение вопроса, который я задал вчера: Как справиться с потенциальной потерей данных при выполнении сравнений по типам данных в разных группах

В HIVE возможно ли проводить сравнениямежду двумя столбцами, которые находятся в разных группах типов данных, встроенных в предложение SELECT? Мне нужно сначала определить, какие входящие метаданные для каждого столбца, а затем предоставить логику, которая выбирает, что CAST использовать.

CASE 
    WHEN  Column1 <=> Column2 THEN 0 -- Error occurs here if data types are in different data type groups (i.e., BIGINT <=> STRING)
    ELSE 1
END

Если это невозможно, есть ли обходной путь для получения метаданныхданные и выполнять CAST'ing на основе определенных правил? Например, если:

  1. Столбец1 равен BIGINT
  2. Столбец2 равен STRING

Затем CAST Column2 как BIGINT, а затем выполните сравнение. Самое простое возможное решение желательно. Я надеюсь, что мне не придется вносить существенные изменения в базовую систему, которая генерирует оператор SELECT.

Обновление 2: Существует внутренняя система, которая генерируетЗапросы SQOOP, и в этой системе есть функция, которая изменяет предложение SELECT для сравнения двух столбцов. Проблема, с которой мы сталкиваемся, заключается в том, что столбцы раньше неявно конвертировались в более ранней версии HIVE / Cloudera, которую мы использовали. Теперь, когда мы выполняем обновление до версии, которая не поддерживает неявное преобразование типов данных, нам нужно найти простейшее решение для продолжения поддержки преобразования типов данных. К сожалению, в бэк-энде нет доступных метаданных, поэтому я пытаюсь взломать их в предложении SELECT

1 Ответ

1 голос
/ 04 октября 2019

Приведение неявно - хорошая идея:

CASE 
    WHEN  Column1 <=> cast(Column2 as bigint) THEN 0 
    ELSE 1
END

Если невозможно выполнить приведение, результат приведения равен NULL.

...