在RedShift表中存储数组的正确方法是什么?

时间:2018-08-03 22:29:00

标签: postgresql apache-spark dataframe apache-spark-sql amazon-redshift

在Redshift中创建表时遇到以下错误:

Column "main.sales_metrics" has unsupported type "character varying[]".;

在DataFrame模式中,它看起来像这样:

|-- sales_metrics: array (nullable = true)
     |-- element: string (nullable = true)

我试图像通常在PostgreSQL中那样声明该列:sales_metrics text[]正如我从文档中看到的那样,Amazon Redshift不支持PostgreSQL数据类型。

那么在RedShift中创建表时,如何正确声明存储sales_metrics的{​​{1}}列?

2 个答案:

答案 0 :(得分:3)

Redshift does not support arrays,但可以使用一些JSON functions。 基本上,您可以将数据存储为varchar并使用json函数查询数据

例如:

create temporary table sales_metrics (col1 varchar(20));
insert into sales_metrics values ('[1,2,3]');

然后

select json_extract_array_element_text(col1, 2) from sales_metrics;
 json_extract_array_element_text
---------------------------------
 3
(1 row)

答案 1 :(得分:1)

除了@ittus的答案外,请注意Redshift对数组的存储方式很挑剔。

         json_arrays          | is_valid_json_array
------------------------------+---------------------
 []                           | t
 ["a","b"]                    | t
 ["a",["b",1,["c",2,3,null]]] | t
 {"a":1}                      | f
 a                            | f
 {foo, bar}                   | f
 {"one", "two"}               | f
 [x,y,z]                      | f
 [1,2,]                       | f