从 Athena/Presto 中的嵌套行中提取数据
Extract data from a nested row in Athena/Presto
我有数据表示为行数组(值 varchar)。这些数组是可变长度的,但我想将它们提取到它们自己的列中,或者提取到一个 varchar 数组中。
尽管typeof()
说这个数据是一行,但我似乎无法直接访问它。我可以将 row(value varchar)
类型的数据直接转换为 varchar 吗?或者对数组做同样的事情?
SELECT records[1], records FROM recorddata
_col0 _col1
{value=data1} [{value=data1}, {value=data2}, {value=data3}, {value=data4}]
{value=data6} [{value=data6}, {value=data7}]
SELECT typeof(records[1]), typeof(records) FROM recorddata
_col0 _col1
1 row(value varchar) array(row(value varchar))
2 row(value varchar) array(row(value varchar))
3 row(value varchar) array(row(value varchar))
谢谢
经过更多处理后,答案似乎是将这些字段转换为 json,从而将它们转换为 varchar 数组。
SELECT cast(records[1] as json), cast(records as json) FROM recorddata
结果:
_col0 _col1
["data1"] ["data1", "data2"], "data3", "data4"]
["data6"] ["data6", "data7"]
使用 transform
并访问 value
应该可以解决问题:
WITH dataset AS (
SELECT *
FROM (VALUES
(ARRAY[CAST(ROW('data1') AS ROW(value varchar)), CAST(ROW('data2') AS ROW(value varchar))]),
(ARRAY[CAST(ROW('data3') AS ROW(value varchar)), CAST(ROW('data4') AS ROW(value varchar))])
) AS t (records))
SELECT transform(records, x -> x.value)
FROM
dataset
输出:
_col0
[data1, data2]
[data3, data4]
我有数据表示为行数组(值 varchar)。这些数组是可变长度的,但我想将它们提取到它们自己的列中,或者提取到一个 varchar 数组中。
尽管typeof()
说这个数据是一行,但我似乎无法直接访问它。我可以将 row(value varchar)
类型的数据直接转换为 varchar 吗?或者对数组做同样的事情?
SELECT records[1], records FROM recorddata
_col0 _col1
{value=data1} [{value=data1}, {value=data2}, {value=data3}, {value=data4}]
{value=data6} [{value=data6}, {value=data7}]
SELECT typeof(records[1]), typeof(records) FROM recorddata
_col0 _col1
1 row(value varchar) array(row(value varchar))
2 row(value varchar) array(row(value varchar))
3 row(value varchar) array(row(value varchar))
谢谢
经过更多处理后,答案似乎是将这些字段转换为 json,从而将它们转换为 varchar 数组。
SELECT cast(records[1] as json), cast(records as json) FROM recorddata
结果:
_col0 _col1
["data1"] ["data1", "data2"], "data3", "data4"]
["data6"] ["data6", "data7"]
使用 transform
并访问 value
应该可以解决问题:
WITH dataset AS (
SELECT *
FROM (VALUES
(ARRAY[CAST(ROW('data1') AS ROW(value varchar)), CAST(ROW('data2') AS ROW(value varchar))]),
(ARRAY[CAST(ROW('data3') AS ROW(value varchar)), CAST(ROW('data4') AS ROW(value varchar))])
) AS t (records))
SELECT transform(records, x -> x.value)
FROM
dataset
输出:
_col0 |
---|
[data1, data2] |
[data3, data4] |