HIVE SQL для извлечения записи в формате JSON - PullRequest
1 голос
/ 23 октября 2019

У меня есть таблица в Hive с несколькими полями. Например,

-------------------------------------------------------------
|Primary Key|Attribute 1|Attribute 2|Attribute 3|Attribute 4|
-------------------------------------------------------------

Мне нужно запросить таблицу с помощью HIVE SQL и вернуть объект JSON, встроенный в формат CSV. Например:

Primary Key, Attribute 1, {"Primary Key":"", "Attribute 2":"",  "Attribute 2":""}, Attribute 4

У меня нет языка программирования после запроса для преобразования значений в формат JSON. У меня нет проблем с прямым SQL, я просто не знаю, смогу ли я получить объект JSON, используя sql.

Любые идеи очень ценятся.

1 Ответ

0 голосов
/ 29 октября 2019

Я использовал brickhouse JAR (brickhouse-0.6.0.jar) для JSON вывода, чтобы добиться чего-то подобного. Это лучший из доступных банок, но если нам нужны ключи в JSON для сохранения camelcases, то в условие to_json(named_struct()) необходимо добавить дополнительный элемент.

Вы можете прочитать больше оэтот JAR здесь . Ниже приведен фрагмент кода о том, как я это сделал.

ADD JAR path/to/jar/brickhouse-0.6.0.jar;
CREATE TEMPORARY FUNCTION to_json AS 'brickhouse.udf.json.ToJsonUDF'; 

CREATE TABLE IF NOT EXISTS V2
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ','
LINES TERMINATED BY '\n'
SELECT
    empId,
    to_json(named_struct('camel_case', 1, 'employee_id', employeeId, 'manager_id', msgId, 'org_Id', orgId), true) AS jsonString
FROM 
    employee
WHERE 
    employeeId=101
);

Вывод будет выглядеть следующим образом:

101, {"camelCase" : true, "employeeId" : 101, "managerId" : 201, "orgId" : 301}

Мне пришлось разобраться со случаем, когда мне пришлось иметь дело с Array of JSON элементами, которые должны быть в квадратных скобках ([]). Вы можете игнорировать внешний слой в следующем запросе (то есть SELECT FROM y и просто использовать запросы до SELECT FROM x), если вы уверены, что у вас есть один JSON на запись. Изменение запроса для обработки Array of JSON.

CREATE TABLE IF NOT EXISTS V2
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ','
LINES TERMINATED BY '\n'
AS 
SELECT 
    y.employeeId, CONCAT('[', y.jsonData, ']') AS jsonData
FROM 
(
    SELECT 
        x.employeeId, collect_list(jsonString) AS jsonData 
    FROM (
    SELECT
    empId,
    to_json(named_struct('camel_case', 1, 'employee_id', employeeId, 'manager_id', msgId, 'org_Id', orgId), true) AS jsonString
    FROM 
        employee
    WHERE 
        employeeId=101
    ) x
    GROUP BY 
        x.employeeId
) y;

Вывод будет выглядеть следующим образом:

101, [{"camelCase" : true, "employeeId" : 101, "managerId" : 201, "orgId" : 301}]

Вы можете настроить этот запрос, чтобы поместить данные в HDFS напрямую, используя эту версию:

INSERT OVERWRITE DIRECTORY '/path/of/target/directory/'
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ','
LINES TERMINATED BY '\n'AS 
SELECT ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...