我在S3上有一堆文件,只包含MD5,每行一个.我创建了一个AWS Athena表来对MD5运行重复数据删除查询.在这些文件和表格中总共有数亿个MD5.
雅典娜表创建查询:
CREATE EXTERNAL TABLE IF NOT EXISTS database.md5s (
`md5` string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = ',',
'field.delim' = ','
) LOCATION 's3://bucket/folder/';
Run Code Online (Sandbox Code Playgroud)
以下是我尝试过的所有"重复数据删除"查询(这些查询应该都是相同的):
SELECT DISTINCT md5
FROM md5s;`
SELECT md5
FROM md5s
GROUP BY md5;
SELECT md5
FROM md5s
GROUP BY DISTINCT md5;
SELECT DISTINCT md5
FROM md5s
GROUP BY DISTINCT md5;
Run Code Online (Sandbox Code Playgroud)
来自Athena的所有结果输出.csvs仍然重复MD5.是什么赋予了?
雅典娜是否正在进行部分重复数据删除?- 更奇特的是,如果我COUNT(DISTINCT md5)在Athena中执行一次,我获得的计数与导出时返回的行数不同.
COUNT(DISTINCT md5) 在雅典娜:97,533,226 雅典娜是否在出口上重复创作? - 情节变粗.如果我在Athena表中查询Athena结果导出中重复的MD5之一,我只从表中获得一个结果/行.我用一个LIKE查询测试了这个,以确保空格不会导致问题.这意味着Athena正在向导出添加重复项.结果中至少有两个相同的MD5.
select
md5, …Run Code Online (Sandbox Code Playgroud) 我正在运行一个查询
select bar_tbl.thing1
from foo
cross join unnest(bar) as t(bar_tbl)
Run Code Online (Sandbox Code Playgroud)
并得到了错误 Error Query failed: Cannot unnest type: row
为什么?
条形列看起来像这样 {thing1=abc, thing2=def}
这是所需的输入和所需的输出.我不熟悉SQL或Presto中使用的术语,文档似乎指向使用,map_agg但我认为这里的问题是动态创建列,但是如果a, b, ...列可以知道且有限的话,这很奇怪.
我很高兴在SQL或Presto中了解它的正确功能,当然如果可行的话.优选地,以不涉及每个所需行=>列手动添加子句的方式.必须有一种方法可以自动执行此操作,或者通过提供值列表来过滤转换为标题的行(如'a'以下将如何移动为列标题)
table_a:
id | key | value
0 | 'a' | 1
1 | 'b' | 2
Run Code Online (Sandbox Code Playgroud)
然后成为desired:
id | 'a' | 'b'
0 1 2
Run Code Online (Sandbox Code Playgroud)
我能得到的最接近的是使用map_agg一组key: values可以在输出中一次拉出一组.然而,理想的解决方案是不必明确列出key我想要输出的每一个,而是爆炸或推出所有键kvs:
with subquery_A as (
select
id,
map_agg(A.key, A.value) as "kvs"
from A as a
group by 1
)
select
sub_a.id,
sub_a.kvs['a'],
sub_a.kvs['b']
from subquery_A as sub_a
Run Code Online (Sandbox Code Playgroud) 我正在使用presto.我有一个数字的ID字段.我想要一个列在id中的数字.因此,如果ID = 1234,我想要一个输出10的列,即1 + 2 + 3 + 4.
我可以使用子字符串来提取每个数字并对它求和,但是有一个我可以使用的函数还是更简单的方法?
我在 Athena 中创建了一个具有以下结构的表
CREATE EXTERNAL TABLE s3_json_objects (
devId string,
type string,
status string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://mybucket/folder1/data/athena_test/';
Run Code Online (Sandbox Code Playgroud)
S3 存储桶对象包含这样的 JSON 结构
Run Code Online (Sandbox Code Playgroud){ "devId": "00abcdef1122334401", "type": "lora", "status": "huihuhukiyg" }
然而,下面的 SQL 正常工作并返回正确的结果,仅用于计数
SELECT count(*) as total_s3_objects FROM "athena_db"."s3_json_objects"
Run Code Online (Sandbox Code Playgroud)
但是每当我在 SQL select 语句下查询以从 S3 中获取 JSON 值时,它都会返回带有列空值的结果集
Run Code Online (Sandbox Code Playgroud)SELECT devid FROM "athena_db"."s3_json_objects" SELECT json_extract(devid , '$.devid') as Id FROM "athena_db"."s3_json_objects" SELECT * FROM "athena_db"."s3_json_objects"
此外,我在 StackOverflow 和AWS Athena doc上发布此问题之前查看了这些链接 …
在 AWS Athena 上,我尝试使用 WITH 子句重用计算数据,例如
WITH temp_table AS (...)
SELECT ...
FROM temp_table t0, temp_table t1, temp_table t2
WHERE ...
Run Code Online (Sandbox Code Playgroud)
如果查询速度很快,“扫描的数据”就会通过屋顶。temp_table每次在FROM子句中引用时都会计算if 。
如果我单独创建一个临时表并在查询中多次使用它,我看不到问题。
有没有办法真正多次重用子查询而不会受到任何惩罚?
我有如下所示的数据集:
Name, Timestamp, Period, Value
Apple, 2012-03-22 00:00:00.000, 10, 34
Apple, 2012-03-22 00:06:00.000, 10, 23
Orange, 2012-03-22 00:00:00.000, 5, 3
Orange, 2012-03-22 00:08:00.000, 5, 45
Run Code Online (Sandbox Code Playgroud)
如果列周期是 N 分钟数,则应按每小时进行分组。因此,例如 Apple 应该在 1:10、1:20、1:30 ex 分组,其中 Orange 是 1:05、1:10 等。我还想对每个增量的 Value 列求平均值。
对于下表(假设它有许多其他行和列),我如何在删除重复项的同时查询它?
| 订单号 | 顾客姓名 | 数量 | 帐单类型 |
|---|---|---|---|
| 1 | 克里斯 | 10 | 销售 |
| 1 | 克里斯 | 1 | 提示 |
| 1 | 克里斯 | 10 | 销售 |
请注意,虽然所有 3 行的顺序大致相同,但只有第 3 行是重复的——因为第 2 行告诉我们该顺序的提示。
使用distinct order_id将删除第 2 行和第 3 行,而我希望仅删除第 3 行。
欣赏任何想法
我有一个 json 对象列表(结果属性),如示例中所示:
select result from mytable limit 1
Run Code Online (Sandbox Code Playgroud)
我得到:
[{hop=1, error=null, result=[{x=null, from=192.168.0.1, rtt=0.378, ttl=64, err=null, ittl=null, edst=null, late=null, mtu=null, size=68, flags=null, dstoptsize=null, hbhoptsize=null, icmpext=null}, {x=null, from=192.168.0.1, rtt=0.314, ttl=64, err=null, ittl=null, edst=null, late=null, mtu=null, size=68, flags=null, dstoptsize=null, hbhoptsize=null, icmpext=null}, {x=null, from=192.168.0.1, rtt=0.303, ttl=64, err=null, ittl=null, edst=null, late=null, mtu=null, size=68, flags=null, dstoptsize=null, hbhoptsize=null, icmpext=null}]}, {hop=2, error=null, result=[{x=null, from=71.120.7.1, rtt=8.135, ttl=254, err=null, ittl=null, edst=null, late=null, mtu=null, size=28, flags=null, dstoptsize=null, hbhoptsize=null, icmpext=null}, {x=null, from=71.120.7.1, rtt=0.769, ttl=254, err=null, ittl=null, edst=null, late=null, mtu=null, size=28, …Run Code Online (Sandbox Code Playgroud) 为什么 AWS Athena 在将结果转储到目标 S3 位置时需要“溢出桶”
WITH
( format = 'Parquet',
parquet_compression = 'SNAPPY',
external_location = '**s3://target_bucket_name/my_data**'
)
AS
WITH my_data_2
AS
(SELECT * FROM existing_tablegenerated_data" limit 10)
SELECT *
FROM my_data_2;
Run Code Online (Sandbox Code Playgroud)
既然它已经有了存储数据的桶,为什么 Athena 需要溢出桶以及它在那里存储什么?