使用 SQL presto 将类似 dict 的 varchar 列拆分为多个列
splitting a dict-like varchar column into multiple columns using SQL presto
我在 table 中有一列是 varchar,但具有类似字典的格式。有些行有更多键值对(例如第一行有 3 对,第二行有 4 对)。
例如:
column
{"customerid":"12345","name":"John", "likes":"Football, Running"}
{"customerid":"54321","name":"Sam", "likes":"Art", "dislikes":"Hiking"}
我需要一个可以像这样“分解”列的查询:
customerid
name
likes
dislikes
12345
John
Football, Running
54321
Sam
Art
Hiking
没有添加额外的行。只是额外的列(table 中还有其他已经存在的列)。
我试过将 varchar 列转换为数组,然后使用 UNNEST 函数,但它不起作用。我认为该方法会创建额外的行。
我正在使用 Prestosql。
您的数据看起来像 json,因此您可以对其进行解析和处理:
-- sample data
WITH dataset (column) AS (
VALUES ('{"customerid":"12345","name":"John", "likes":"Football, Running"}' ),
('{"customerid":"54321","name":"Sam", "likes":"Art", "dislikes":"Hiking"}')
)
--query
select json_extract_scalar(json_parse(column), '$.customerid') customerid,
json_extract_scalar(json_parse(column), '$.name') name,
json_extract_scalar(json_parse(column), '$.likes') likes,
json_extract_scalar(json_parse(column), '$.dislikes') dislikes
from dataset
输出:
customerid
name
likes
dislikes
12345
John
Football, Running
54321
Sam
Art
Hiking
如果有很多列,您可以通过转换为已解析的 json 来美化它以映射(取决于内容,它可以是 map(varchar, varchar)
或 map(varchar, json)
):
--query
select m['customerid'] customerid,
m['name'] name,
m['likes'] likes,
m['dislikes'] dislikes
from (
select cast(json_parse(column) as map(varchar, varchar)) m
from dataset
)
我在 table 中有一列是 varchar,但具有类似字典的格式。有些行有更多键值对(例如第一行有 3 对,第二行有 4 对)。 例如:
column |
---|
{"customerid":"12345","name":"John", "likes":"Football, Running"} |
{"customerid":"54321","name":"Sam", "likes":"Art", "dislikes":"Hiking"} |
我需要一个可以像这样“分解”列的查询:
customerid | name | likes | dislikes |
---|---|---|---|
12345 | John | Football, Running | |
54321 | Sam | Art | Hiking |
没有添加额外的行。只是额外的列(table 中还有其他已经存在的列)。
我试过将 varchar 列转换为数组,然后使用 UNNEST 函数,但它不起作用。我认为该方法会创建额外的行。
我正在使用 Prestosql。
您的数据看起来像 json,因此您可以对其进行解析和处理:
-- sample data
WITH dataset (column) AS (
VALUES ('{"customerid":"12345","name":"John", "likes":"Football, Running"}' ),
('{"customerid":"54321","name":"Sam", "likes":"Art", "dislikes":"Hiking"}')
)
--query
select json_extract_scalar(json_parse(column), '$.customerid') customerid,
json_extract_scalar(json_parse(column), '$.name') name,
json_extract_scalar(json_parse(column), '$.likes') likes,
json_extract_scalar(json_parse(column), '$.dislikes') dislikes
from dataset
输出:
customerid | name | likes | dislikes |
---|---|---|---|
12345 | John | Football, Running | |
54321 | Sam | Art | Hiking |
如果有很多列,您可以通过转换为已解析的 json 来美化它以映射(取决于内容,它可以是 map(varchar, varchar)
或 map(varchar, json)
):
--query
select m['customerid'] customerid,
m['name'] name,
m['likes'] likes,
m['dislikes'] dislikes
from (
select cast(json_parse(column) as map(varchar, varchar)) m
from dataset
)