从 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]