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

Справочная информация: Наша группа проходит обновление Cloudera до 6.1.1, и мне было поручено определить, как справиться с потерей неявного преобразования типов данных между типами данных. См. Ссылку ниже для получения подробной информации о выпуске.

https://docs.cloudera.com/documentation/enterprise/6/release-notes/topics/rg_cdh_611_incompatible_changes.html#hive_union_all_returns_incorrect_data

Эта проблема не только влияет на запросы UNION ALL, но и выполняет функцию сравнения столбцов с различными типами данных (т.е. STRING to BIGINT).

Группа решила, что мы не хотим изменять метаданные базовой таблицы. Таким образом, решение состоит в том, чтобы учесть потенциальную потерю данных с помощью функции CAST () для приведения данных. В случае UNION ALL мы приводим метаданные таблицы назначения. Но, выполняя сравнения, я пытаюсь определить самый простой и легкий способ выполнения сравнений без получения ошибочных результатов.

Вопрос:

Могу ли я просто привести все в STRING или VARCHAR () при выполнении сравнения? Есть ли потенциальные проблемы, которые могут привести к неправильным результатам?

Обновление: Если есть проблемы с этим подходом, есть ли правильное решение, чтобы справиться с этим?

Примечание: это мое первое взаимодействие с Hadoop / HIVE иЯ узнал, что все, что я знаю в земле СУРБД, не всегда применимо.

1 Ответ

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

Возможно, у вас будут проблемы. Например, если сравнивать строку с целым числом, то:

  • '1.00' = 1 -> true, поскольку значения сравниваются как числа

Но как строки:

  • '1.00' = '1' -> false, потому что значения сравниваются как строки

По-моему, с датами могут возникнуть похожие проблемы.

...