Сканированные данные запроса AWS Athena и время - PullRequest
0 голосов
/ 01 июля 2019

Я выполнил ниже 2 SQL-запросов в Aws Athena QUERY1 и QUERY2.Я только что выбрал все в QUERY1, но в QUERY2 я сделал некоторые преобразования, которые подробно описаны в QUERY2.

Предварительно обработанная таблица состоит из трех столбцов, а именно column1, column2 и id.Все эти три столбца имеют строковый тип.ПОКАЗАТЬ СОЗДАТЬ ТАБЛИЦУ предварительно обработанный результат:

CREATE EXTERNAL TABLE `preprocessed`(
`column1` string COMMENT '',
`column2` string COMMENT '',
`id` string COMMENT '')
ROW FORMAT SERDE 
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUT FORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://mybucket/myobject'
TBLPROPERTIES (
'has_encrypted_data'='false')

Данные отсканированы в QUERY1 = 13 МБ Время занято в QUERY1 = 12 с

Данные отсканированы в QUERY2 = 27 МБ Время взято в QUERY2 = 18 сек

Данные, отсканированные в QUERY2, в два раза больше, чем в QUERY2.Я думаю, это потому, что я дважды сканирую набор данных в QUERY2.Я хочу, чтобы мои отсканированные данные были улучшены примерно до 13 МБ для QUERY2

QUERY1 :
WITH dataset AS
(
SELECT column1, column2, COUNT(DISTINCT id) AS value FROM preprocessed
)
SELECT * FROM dataset

QUERY2 :
WITH dataset AS
(
SELECT column1, column2, COUNT(DISTINCT id) AS value FROM preprocessed
),
dataset_1 AS
(
SELECT DISTINCT column1 FROM dataset
),
dataset_2 AS
(
SELECT DISTINCT column2 FROM dataset
),
dataset_3 AS
(
SELECT column1, column2 FROM dataset_1, dataset_2
)
SELECT * FROM dataset_3

1 Ответ

0 голосов
/ 04 июля 2019

То, что вы спрашиваете, в настоящее время невозможно с Афиной.Если я правильно понимаю ваш вопрос, вы хотели бы вычислить перекрестное объединение различных значений column1 и column2.

Афина не использует повторно результаты именованных запросов, что означает, что в вашем запросе, когдаdataset_1 и dataset_2 оценены, они оба запустят оператор в dataset.

Чтобы не читать исходную таблицу дважды, вам придется вычислять различные значения column1 и column2 водин запросЭто можно сделать с помощью функций array_agg и UNNEST:

SELECT
  column1,
  column2
FROM (
  SELECT
    array_agg(DISTINCT column1) AS column1_values,
    array_agg(DISTINCT column2) AS column2_values
  FROM preprocessed
)
CROSS JOIN UNNEST (column1_values) c1 (column1)
CROSS JOIN UNNEST (column2_values) c2 (column2)

. Вам нужно будет проверить, насколько хорошо он работает для больших мощностей.

...