【问题标题】:HIVE SQL to extract Record as JSONHIVE SQL 将记录提取为 JSON
【发布时间】:2019-10-23 18:42:02
【问题描述】:

我在 Hive 中有一个包含多个字段的表。例如

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

我需要使用 HIVE SQL 查询表并返回一个以 CSV 格式嵌入的 JSON 对象。例如:

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

我没有任何后查询编程语言来将值转换为 JSON 格式。直接用sql没问题,就是不知道能不能用sql把json对象取出来。

非常感谢任何想法。

【问题讨论】:

    标签: json hive hiveql


    【解决方案1】:

    我使用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 ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-08
      • 2020-06-20
      • 1970-01-01
      • 2012-11-11
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多