Нет доступа к элементам массива в AWS Athena

У меня есть файл .txt со столбцом с массивом строк, разделенных запятыми, заключенных в скобки, и я хотел бы провести некоторый анализ в AWS Athena / QS. Исходные данные выглядят так:

col_id    col2
1         ["string1", "string2", "string3", "string4"] 
2         ["string1", "string2"]
3         ["string1", "string2", "string3"]
...

Я создал таблицу в Афине со следующим:

create external table db.xx (
    col1 string,
    col2 array<string>

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '  ',
  'field.delim' = ' ',
  'collection.delim' = ','
) LOCATION 's3://xxx'
TBLPROPERTIES ("skip.header.line.count"="1");

Таблица успешно создана, и столбец распознается как тип данных массива.

Однако я не могу получить доступ к элементам в массиве.

select element_at (col2,1) from table возвращает:

string1, string2, string3, string4
string1, string2
string1, string2, string3

Я также пытался удалить [] и "" из необработанных данных, но все равно получил те же результаты.


person hvrjnvr    schedule 18.04.2020    source источник


Ответы (1)


CSV не имеют типа массива, и есть много способов кодирования массива. К сожалению, Афина не определяет автоматически, каким образом это делают ваши данные, даже если вы говорите, что столбец имеет тип array<string>.

Однако существует обходной путь: используйте string для типа столбца, а затем преобразуйте значение в JSON во время запроса (поскольку похоже, что ваши массивы кодируются так, как JSON кодирует массивы строк) или используйте один из многие функции JSON для извлечения значений из массива:

Создайте такую ​​таблицу:

create external table db.xx (
    col1 string,
    col2 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '  ',
  'field.delim' = ' ',
  'collection.delim' = ','
) LOCATION 's3://xxx'
TBLPROPERTIES ("skip.header.line.count"="1");

а затем запросите его так:

SELECT
  col1,
  json_array_get(col2, 0)
FROM db.xx
person Theo    schedule 19.04.2020