Я использовал 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 ...