示例:地理空间查询 - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

示例:地理空间查询

以下示例创建两个表并针对它们发出查询。

注意

这些文件 包括在产品中,仅用于说明目的。它们包含示例数据,不一定是准确的。

这些示例依赖于两个文件:

  • 一个 earthquakes.csv 示例文件,其中列出了加利福尼亚发生的地震。此文件包含与以下示例的表 earthquakes 中的字段对应的字段。

  • 一个 california-counties.json 文件,其中列出了采用 ESRI 兼容格式的 JSON 编码县数据,而且包括许多字段,例如 AREA、PERIMETER、STATE、COUNTY 和 NAME。以下示例显示该文件中仅有两个字段的 counties 表:Name (字符串) 和 BoundaryShape (二进制)。

有关地理空间查询的更多示例,请参阅以下博客文章:

以下代码示例创建一个名为 earthquakes 的表:

CREATE external TABLE earthquakes ( earthquake_date string, latitude double, longitude double, depth double, magnitude double, magtype string, mbstations string, gap string, distance string, rms string, source string, eventid string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION 's3://my-query-log/csv/';

以下代码示例创建一个名为 counties 的表:

CREATE external TABLE IF NOT EXISTS counties ( Name string, BoundaryShape binary ) ROW FORMAT SERDE 'com.esri.hadoop.hive.serde.JsonSerde' STORED AS INPUTFORMAT 'com.esri.json.hadoop.EnclosedJsonInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://my-query-log/json/';

以下代码示例为之前创建的两个表使用 CROSS JOIN 函数。此外,对于两个表,它会使用 ST_CONTAINS 并要求提供其边界包含地震的地理位置的县 (通过 ST_POINT 指定)。然后,它会按名称对这些县进行分组,然后按计数对其进行排序,并以降序返回它们。

SELECT counties.name, COUNT(*) cnt FROM counties CROSS JOIN earthquakes WHERE ST_CONTAINS (counties.boundaryshape, ST_POINT(earthquakes.longitude, earthquakes.latitude)) GROUP BY counties.name ORDER BY cnt DESC

此查询返回:

+------------------------+ | name | cnt | +------------------------+ | Kern | 36 | +------------------------+ | San Bernardino | 35 | +------------------------+ | Imperial | 28 | +------------------------+ | Inyo | 20 | +------------------------+ | Los Angeles | 18 | +------------------------+ | Riverside | 14 | +------------------------+ | Monterey | 14 | +------------------------+ | Santa Clara | 12 | +------------------------+ | San Benito | 11 | +------------------------+ | Fresno | 11 | +------------------------+ | San Diego | 7 | +------------------------+ | Santa Cruz | 5 | +------------------------+ | Ventura | 3 | +------------------------+ | San Luis Obispo | 3 | +------------------------+ | Orange | 2 | +------------------------+ | San Mateo | 1 | +------------------------+