Apache Drill:将 JSON as String 转换为 JSON 对象以检索每个元素

Apache Drill: Convert JSON as String to JSON object to retrieve each element

我在 hive table 的一列中有以下字符串,我正在尝试使用 apache drill:

进行查询

{"cdrreasun":"52","cdxscarc":"20150407161405","cdrend":"20150407155201","cdrdnrar.1un":"24321.70","servlnqlp":"54.201.25.50","men":"42403","xa:lnqruup":"3","cemcau":"120","accuuncl":"21","cdrc: 5","volcuca":"1.7"}

想要使用 apache drill SQL.

检索键 cdrreasun 的所有值

不能在列上使用 FLATTEN,因为它说 Flatten does not work with inputs of non-list types.

不能使用 KVGEN,因为它只适用于 MAP 数据类型。

Drill 的函数 convert_fromJSON 允许从字符串转换为 JSON 对象。有关此功能的更多详细信息和使用示例,请参阅 https://drill.apache.org/docs/data-type-conversion/#convert_to-and-convert_from

对于您指定的示例,您可以运行

convert_fromJSON(colWithJsonText)['cdrreasun']

我弄明白了,希望对其他人有帮助。

如果数据类型是 MAP 类型,我们必须分 3 步完成:

KVGEN() -> FLATTEN() -> convert_from()

如果它是 STRING 类型,则不需要 KVGEN() 函数。

SELECT ratinggrouplist
    ,t3.cdrlist3.cdrreason AS cdrreason
    ,t3.cdrlist3.cdrstart AS cdrstart
    ,t3.cdrlist3.cdrend AS cdrend
    ,t3.cdrlist3.cdrduration AS cdrduration
FROM (
    SELECT ratinggrouplist, convert_from(t2.cdrlist2.`element`, 'JSON') AS cdrlist3
    FROM (
        SELECT ratinggrouplist ,flatten(t1.cdrlist1.`value`) AS cdrlist2
        FROM (
            SELECT ratinggrouplist, kvgen(cdrlist) AS cdrlist1
            FROM dfs.tmp.SOME_TABLE
            ) AS t1
        ) AS t2
    ) AS t3;