Невозможно получить доступ к элементам массива в AWS Афина - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть файл .txt, в котором столбец с массивом строк, разделенных запятыми, заключен в скобки, и я хотел бы провести некоторый анализ в AWS Афина / 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) из таблицы возвращает:

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

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

1 Ответ

0 голосов
/ 19 апреля 2020

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
...