Сериализация колонки карты улья - PullRequest
2 голосов
/ 01 мая 2020

Существует ли какая-либо пользовательская udf или другая функция, доступная для сериализации поля карты улья, чтобы его можно было использовать в условиях группировки и объединения.

Например, у нас есть поле карты:

dim_map = {'dim_geo': 'San Francisco', 'dim_country': 'USA'}

Как хотите объединить две таблицы в этом поле.

1 Ответ

1 голос
/ 01 мая 2020

Преобразуйте его в JSON строку, используя brickhouse udf , загрузите исходники, скомпилируйте, добавьте файл jar и создайте функцию, см. Getting Started инструкции:

add jar /path/brickhouse-0.7.0-SNAPSHOT.jar;  
CREATE TEMPORARY FUNCTION to_json AS 'brickhouse.udf.json.ToJsonUDF';

select to_json(dim_map) as dim_map_json
  from...

Обновление:

Поскольку @ rajni sh упоминается в комментарии, карты не упорядочены, и это может вызвать проблемы при сравнении таких карт, преобразованных в JSON.

Пример карт:

with test_data as (
select map('dim_geo', 'San Francisco', 'dim_country','USA') map1,
       map('dim_country','USA','dim_geo', 'San Francisco') map2

)

select map1, map2, 
       case when map1['dim_geo']     = map2['dim_geo']     
             and map1['dim_country'] = map2['dim_country'] 
            then 'equal'
            else 'not equal' end as compare_maps
from test_data;

Результат:

map1    map2    compare_maps

{"dim_geo":"San Francisco","dim_country":"USA"} {"dim_country":"USA","dim_geo":"San Francisco"} equal

Лучше сравнить каждое значение, как в этом примере, или написать свой UDF, используя метод HashMap.equals.

По умолчанию HashMap. Метод equals () сравнивает две хеш-карты по парам ключ-значение. Это означает, что оба экземпляра hashmap должны иметь одинаковые пары ключ-значение, и оба должны иметь одинаковый размер. Порядок пар ключ-значение может быть разным и не играет роли в сравнении. Как сравнить два хеш-карты в Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...