presto - 扫描的 AWS Athena 查询数据和所用时间
问题描述
我在 Aws Athena QUERY1 和 QUERY2 中运行了 2 个 SQL 查询。我刚刚选择了 QUERY1 中的所有内容,但在 QUERY2 中我做了一些转换,这些转换在 QUERY2 中详细给出。
预处理的表由三列组成,即 column1、column2 和 id。这三列都是字符串类型。SHOW CREATE TABLE 预处理结果:
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 MB QUERY1 中所用时间 = 12 秒
QUERY2 中扫描的数据 = 27MB QUERY2 中所用时间 = 18 秒
QUERY2 中扫描的数据是 QUERY2 中的两倍。我认为这是因为我在 QUERY2 中扫描数据集两次。我希望将我的扫描数据改进为 QUERY2 的大约 13MB
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
解决方案
Athena 目前无法实现您的要求。如果我正确理解您的问题,您想计算 和 的不同值的交叉column1
连接column2
。
Athena 不会重用命名查询的结果,这意味着在您的查询中 whendataset_1
和dataset_2
被评估时,它们都将在dataset
.
为避免两次读取源表,您必须在一次查询中计算column1
和的不同值。column2
这可以通过array_agg
函数 and来完成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)
您必须测试它对大基数的表现如何。
推荐阅读
- assembly - 嵌套循环 - x86 NASM
- html - 可以改进这个 CSS 解决方案以获得更好的响应能力吗?
- c# - 从一个列表中删除元素如果不包含在另一个列表中。C#
- c - 使用基于 SDL2 的三角形光栅化器的三角形颜色不正确?
- xamarin - 使用 XAMARIN 和 BLE 识别附近的设备
- html - 在类中选择一个 id
- java - 使用 XML 与 Java DSL 的 Spring 集成有什么区别?
- appium - 错误的原因是什么:org.openqa.selenium.WebDriverException:返回值无法转换为 WebElement:
- django - 当浏览器和邮递员使用时,Angular 没有获取数据
- javascript - 我的 React 组件 fetch 或 axios 没有将值发布到 Api