AWS Amazon Athena невозможно разделить данные с помощью поля BOOLEAN - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь разделить свои данные в Amazon Athena с помощью логического поля, но, похоже, оно не работает.

Мои данные (в JSON) выглядят следующим образом:

{
    "name": "apple",
    "size": "L",
    "color": "red",
    "fruit": true
}

or

{
    "name": "brocolis",
    "size": "L",
    "color": "green",
    "fruit": false
}

Я создал таблицу на Amazon Athena следующим образом:

CREATE EXTERNAL TABLE fruits (
  name string, 
  color string, 
  size string
)
PARTITIONED BY (fruit boolean)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
LOCATION
  's3://bucket-for-athena-test/'

Затем я пытаюсь создать первый раздел следующим образом:

ALTER TABLE fruits ADD PARTITION (fruit = true) LOCATION 's3://bucket-for-athena-test/fruits/'

И я получаю ошибку сообщение:

Your query has the following error(s):

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:One or more parameter values were invalid: An AttributeValue may not contain an empty string (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: FI07HJFNAKH3HLUU5DATP2G4LJVV4KQNSO5AEMVJF66Q9ASUAAJG))

This query ran against the "fruits_database" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: 3aa0434e-b492-4090-8dd6-24e498a0e1fa.

Может кто-нибудь помочь мне?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Стиль раздела, используемый Афиной, происходит от стиля Hive. Вы не можете создать таблицу с столбцом раздела в качестве столбца из фактических данных. Скорее этот раздел должен быть частью вашего местоположения, например, в вашем случае путь s3 должен быть чем-то вроде 's3://bucket-for-athena-test/fruit=mango' или 's3://bucket-for-athena-test/fruit=apple'.

Таким образом, этот путь 's3://bucket-for-athena-test/fruit=mango' будет иметь данные со всеми манго и 's3://bucket-for-athena-test/fruit=apple' будет иметь яблоки.

Когда вы запускаете запрос поверх этой таблицы, применяя фильтр типа select * from table where fruit = 'mango', он будет сканировать только данные man go и оставит другие папки без изменений. Это реальное преимущество секционирования, где пропускается сканирование ненужных данных.

Чтобы узнать больше о секционировании, обратитесь к this .

Так что если вы хотите создать секционированную таблицу из обычной таблицы, то вы можете используйте пример CTAS, как показано здесь

CREATE TABLE fruits_partitioned 
WITH (
     format = 'TEXTFILE',  
     external_location = 's3://bucket-for-athena-test/', 
     partitioned_by = ARRAY['fruit']) 
AS SELECT column1, column2, column3, fruit
FROM fruit_unpartitioned;
0 голосов
/ 06 февраля 2020

Исходная ошибка:

Одно или несколько значений параметров недопустимы: значение AttributeValue может не содержать пустую строку

Это означает, что что запрос на раздел был предпринят для столбца (значения атрибута), который не существует.

В столбце указано имя столбца: 'fruit' .

Однако столбец с именем 'fruit' не определен в структуре таблицы. Это root причина ошибки.

Как решить проблему?

Исправление можно сделать двумя способами -

  1. Запустить запрос на разделение по одному из имен столбцов, существующих в структуре таблицы (Пример: цвет)

  2. Измените структуру таблицы, добавив в качестве столбца «фрукты» .

...