发布于: Nov 30, 2022

【概要】怎样进行大数据分析,下面就以基于东京区域的服务为例进行实践

怎样进行大数据分析,下面就以基于东京区域的服务为例进行实践:

步骤 1:准备查询的数据

  1. 通过以下网址下载美国交通事故开放数据 https://catalog.data.gov/dataset/traffic-collision-data-from-2010-to-present
  2. 打开 Amazon S3 控制台此链接
  3. 在东京区域创建一个 S3 存储桶取一个具有唯一性的名字例如 athena-demo-tokyo-trafficdata-<当前日期>
  4. 在桶内创建一个文件夹 traffic-collision-one-file 并上传源数据

步骤 2:创建一张 Athena 表并查询

2.1 使用 DDL SQL 语句创建您的 Amazon Athena 表

(1) 通过以下网址打开 Athena 控制台: 此链接。(登陆的 IAM user 需要有 AmazonAthenaFullAccess 策略)

(2) 通过在查询栏输入“create database demo;” 并且点击 run query 创建一个新 database。

(3) Database 在下拉栏里选择新建的 demo,然后在查询栏里输入 create table DDL 创建一个新表。把 S3 存储桶换成步骤 1 中新建的 S3 路径。

CREATE EXTERNAL TABLE traffic_collision_data(
  dr_number string , 
  date_reported string , 
  date_occurred string , 
  time_occurred string , 
  area_id string , 
  area_name string , 
  reporting_district string , 
  crime_code string , 
  crime_code_description string , 
  mo_codes string , 
  victim_age string , 
  victim_sex string , 
  victim_descent string , 
  premise_code string , 
  premise_description string , 
  address string , 
  cross_street string , 
  location string , 
  zip_codes string , 
  census_tracts string , 
  precinct_boundaries string , 
  la_specific_plans string , 
  council_districts string , 
  neighborhood_councils string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES ('skip.header.line.count'='1','serialization.format' = ',',
  'quoteChar' = '"',
  'field.delim' = ',' ) 
LOCATION 's3://athena-demo-tokyo-trafficdata-<当前日期>/traffic-collision-one-file/';

(4) 在查询栏里输入“select * from traffic_collision_data limit 10”来观察数据含义。点击 Save as 给查询命名,以便日后重复使用。

2.2 建立逻辑视图来方便终端用户或展示工具查询

(1) 统计每天发生的交通事故数量,在查询栏查询下列 SQL

SELECT date_reported, count(*) as num_accident
FROM traffic_collision_data 
group by date_reported
order by date_reported;

(2) 点击 Create,选择 create view from query 并取名为 daily_accident_count_report。成功创建后查询栏会出现创建视图的 DDL 语句,日后也可通过 DDL SQL 语句创建。

(3) 查询视图的内容 “select * from daily_accident_count_report”

2.3 把数据从单一 CSV 文件转化为带分区的 parquet 格式

(1) 在查询栏里键入一下 create table with SQL 语句。把 external_location 换成步骤 1 中的 S3 桶。此语句会创建一张新表和新 S3 地址,并且新 S3 地址会根据 area_id 做分区键,新数据会存为压缩的 parquet 格式可以极大的减小数据量。

CREATE TABLE traffic_collision_data_partitioned
  WITH (format='parquet', 
  external_location='s3://athena-demo-tokyo-trafficdata-<当前日期>/traffic-collision-partitioned/',
  partitioned_by= ARRAY['area_id'],
  parquet_compression = 'SNAPPY') AS
SELECT
  DR_Number,
  date_reported, 
  time_occurred,
  area_name,
  reporting_district,
  crime_code,
  crime_code_description,
  mo_codes,
  victim_age,
  victim_sex,
  victim_descent,
  premise_description,
  address,
  location,
  date_occurred,
  zip_codes,
  area_id
FROM
  traffic_collision_data;

(2) 可以看到新建的表是一个具有分区的表,并且新的 S3 路径带有分区列信息。

步骤 3: 利用 workgroups 管理查询资源

1. 切换到 workgroup 面板,点击 create workgroup

2. 创建一个新的 workgroup。

3. 点击切换 workgroup。

4. 点击 view details 可以更改 workgroup 设置,选择 Data Usage Controls 面板,添加每条查询扫过的数据量上限。

5. 添加针对每个 workgroup 指定时间段扫过数据量的上限。

6. 创建一个只有权限使用 adhoc workgroup 的 IAM 用户。用该用户登陆 Amazon Web Services 控制台然后尝试切换成 primary workgroup 然后查询。可以看到查询报没有权限的错误。

把以下 IAM 策略赋予该用户,并把其中的替换成自己的 Amazon Web Services 账号(12 位数字)

注:如果是使用宁夏和北京区域请把以下 Resource 部分所有的 “arn:aws:” 改成 “arn:aws-cn:”
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetDatabases",
                "glue:GetTables",
                "glue:GetTable",
                "glue:GetPartitions"
            ],
            "Resource": [
                "arn:aws:glue:*:<Amazon账号>:catalog",
                "arn:aws:glue:*:<Amazon账号>:database/*",
                "arn:aws:glue:*:<Amazon账号>:table/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListWorkGroups"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:GetQueryResults",
                "athena:DeleteNamedQuery",
                "athena:GetNamedQuery",
                "athena:ListQueryExecutions",
                "athena:StopQueryExecution",
                "athena:GetQueryResultsStream",
                "athena:ListNamedQueries",
                "athena:CreateNamedQuery",
                "athena:GetQueryExecution",
                "athena:BatchGetNamedQuery",
                "athena:BatchGetQueryExecution",
                "athena:GetWorkGroup"
            ],
            "Resource": [
                "arn:aws:athena:*:<Amazon 账号>:workgroup/adhoc"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:List*",
                "s3:Get*",
                "s3:Put*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

 

 

相关文章