我使用brickhouse JAR (brickhouse-0.6.0.jar) 输出JSON 来实现类似的效果。这是最好的 jar,但如果我们需要 JSON 中的密钥来保留 camelcases,则需要在 to_json(named_struct()) 子句中添加一个额外的元素。
您可以阅读有关此 JAR 的更多信息here。下面是关于我如何做到这一点的代码 sn-p。
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 元素的情况。如果您确定每条记录有一个 JSON,则可以忽略以下查询中的最外层(即 SELECT FROM y 并且只使用查询直到 SELECT FROM x)。处理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 ...