数组到带有 prestodb 的字符串

array to string with prestodb

我在 Athena 控制台中有一个 AWS Athena (parquet) 数据库 returns:

.. 来自以下查询:

SELECT id, 
TYPEOF(organisations) as type,
cardinality(organisations) as len,
organisations
FROM mydb.tbl;

将完整的 table 远程读取到 Python(使用 awswrangler)失败,因为 organisations 是数组(有时长度为零)。我一直在尝试将 organisaions 字段转换为数组的字符串表示形式(或等效的 json),但到目前为止我没有尝试过。非常感谢任何建议。

如果您不关心保留 organizationcharoffset 字段名称,您可以将数组转换为 JSON,然后将其格式化为 varchar json_format:

WITH t(organizations) AS (
   VALUES
        ARRAY[ROW('x', 1), ROW('y', 2)],
        ARRAY[ROW('a', 3), ROW('b', 4)],
        ARRAY[]
)
SELECT json_format(CAST(organizations AS JSON))
FROM t

=>

       _col0
-------------------
 [["x",1],["y",2]]
 [["a",3],["b",4]]
 []

如果您的数组元素可以转换为 varchar,您可以使用 array_join 函数将数组转换为字符串,请参阅此处的文档

https://prestodb.io/docs/current/functions/array.html

例如:

WITH t(organizations) AS (
   VALUES
        ARRAY[1,2,3,4,5],
        ARRAY[]
)
SELECT array_join(organizations, ',')
FROM t

如果您的数组包含更复杂的元素,您可以先使用 transform 函数将它们“自定义”转换为 varchar 并将其提供给 array_join 函数,例如:

WITH t(organisations) AS (
   VALUES
        ARRAY[cast(ROW('Police Scotland', 6) as ROW(organisation varchar, charoffset integer))],
        ARRAY[]
)
SELECT '{' || array_join(transform(organisations, x -> '{organisation='||x.organisation||',charoffset='||cast(x.charoffset as varchar)||'}'),',') || '}'
FROM t