将表中的列组合成 JSON 对象

Posted

技术标签:

【中文标题】将表中的列组合成 JSON 对象【英文标题】:Combine columns from a table into a JSON object 【发布时间】:2020-02-15 19:32:10 【问题描述】:

我在雅典娜有一张数据表

type   state   city  zipcode
-------------------------------
hot     az     phx    85281
hot     tx     dal    12345
cool    wa     sea    67890
cool    ny     nyc    67856

我希望输出是这样的

type   Data 
-------------
hot    state: az, city:phx, zipcode: 85281
hot    state: tx, city:dal, zipcode: 12345
cool   state: wa, city:sea, zipcode: 67890
cool   state: ny, city:nyc, zipcode: 67856

我正在尝试使用聚合函数,但我无法使用它。

SELECT 类型,CAST(MAP(ARRAY['state', 'city', 'zipcode'], ARRAY[state,city,zipcode] ) AS JSON) FROM "test"."alldata"

但查询失败。

【问题讨论】:

为什么你的结果中只有 3 行而不是 4 行? 理想情况下应该有4个。只是一个例子。修改了 您在寻找 mysql 解决方案还是 Athena 解决方案?请仅标记相关数据库。 【参考方案1】:

对于 Hive:

with mydata as (
select stack(4,
    'hot', 'az', 'phx', 85281,
    'hot', 'tx', 'dal', 12345,
    'cool', 'wa', 'sea', 67890,
    'cool', 'ny', 'nyc', 67856
) as  (type, state, city, zipcode)
)

select type, map('state', state, 'city', city,'zipcode',zipcode) as data
 from mydata;

结果:

type    data
hot     "state":"az","city":"phx","zipcode":"85281"
hot     "state":"tx","city":"dal","zipcode":"12345"
cool    "state":"wa","city":"sea","zipcode":"67890"
cool    "state":"ny","city":"nyc","zipcode":"67856"

如果需要字符串类型,请使用brickhouse库:

add jar /path/brickhouse-0.7.0-SNAPSHOT.jar; --compile jar and load it to the distributed cache
CREATE TEMPORARY FUNCTION to_json AS 'brickhouse.udf.json.ToJsonUDF';

select type, to_json(map('state', state, 'city', city,'zipcode',zipcode)) as data
 from mydata;

【讨论】:

我试图使用 select type, collect_set(to_json(map('state', state, 'city', city,'zipcode',zipcode))) 作为 addData group by type from我的数据;所需的 O/p。 ``` 热 , [ "state":"az","city":"phx","zipcode":"85281", "state":"tx","city":"dal"," zipcode":"12345" ] 酷,[ "state":"wa","city":"sea","zipcode":"67890", "state":"ny","city": "nyc","zipcode":"67856" ] ``` 当我尝试使用 collect_set 时,它会抛出异常是属性名称 "collect_set(addData)" 在 " ,;( )\n\t="。请使用别名重命名。; @Vinny 使用 collect() 砖房功能。 collect(map(....)) - 这将产生 JSON 数组。【参考方案2】:

如果你有 5.7 或更高版本的 mysql 版本:使用

SELECT `type`,json_object('state', `state`, 'city', `city`,'zipcode',`zipcode`)
FROM alldata;
CREATE TABLE alldata
    (`type` varchar(4), `state` varchar(2), `city` varchar(3), `zipcode` int)
;
    
INSERT INTO alldata
    (`type`, `state`, `city`, `zipcode`)
VALUES
    ('hot', 'az', 'phx', 85281),
    ('hot', 'tx', 'dal', 12345),
    ('cool', 'wa', 'sea', 67890),
    ('cool', 'ny', 'nyc', 67856)
;
✓ ✓
SELECT `type`,json_object('state', `state`, 'city', `city`,'zipcode',`zipcode`)
FROM alldata;
类型 | json_object('state', `state`, 'city', `city`,'zipcode',`zipcode`) :--- | :------------------------------------------------ --------------- 热 | “城市”:“phx”,“州”:“az”,“邮政编码”:85281 热 | “城市”:“dal”,“州”:“tx”,“邮政编码”:12345 酷 | “城市”:“海”,“州”:“wa”,“邮政编码”:67890 酷 | “城市”:“纽约”,“州”:“纽约”,“邮政编码”:67856

db小提琴here

【讨论】:

以上是关于将表中的列组合成 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

将一个表的连接列与另一个表的一列组合成 JAVA 对象

如何组合熊猫数据透视表中的列?

将表中的列与 hive 中另一个表的列进行比较

将表中的一列替换为不同表中的列并选择 *

将表中的列值作为参数传递给存储过程 sql

pandas将dataframe数据列中的年月日列组合成单一的日期数据列实战