关键词:Athena、QuickSight,S3
适读水平:有一定AWS基础
适读职业:数据分析,DBA
应用场景:大数据分析
随着目前企业数字化转型的推进,业务系统产生了大量数据,如何利用好这些海量数据成为企业IT运营面临的一大难题。从传统的方案来看,需要企业自行架设Hadoop集群,由于大数据分析对数据存储和数据运算需求都比较高,所以硬件配置的需求也很高,导致整个项目成本高昂。
在使用了云服务器以后,可以解决本地数据中心的运维难题,并通过高标准高规格的硬件和数据中心提升了整体系统的稳定性。但如果只是通过云服务器来部署,仅仅是解决了服务器运维的问题,并不能最大化的利用云端大数据分析服务的优势。
在AWS上除了提供托管Hadoop服务的EMR之外,还提供了很多大数据相关的分析服务,例如数据仓库Redshift,实时数据处理Kinesis,ETL服务Glue等。
在AWS托管的服务上,您只需要为使用的资源付费,按需付费模式避免本地数据中心建设中的重资产投入,也避免了云服务器空闲时间导致的资源浪费。
今天我们来演示一种快速进行大数据分析的场景,无需架设服务器,实时使用SQL语言进行数据查询。
背景和挑战
全球气候分析对于研究人员评估气候变化对地球自然资本和生态系统资源的影响至关重要。 这项活动需要高质量的气候数据集,这可能是具有挑战性的工作,因为它们的规模和复杂性。
为了对他们的发现有信心,研究人员必须对他们研究的气候数据集的来源有信心。 例如,研究人员可能会试图回答这样的问题: 某个特定粮食生产区的气候变化是否会影响粮食安全? 他们必须能够轻松地查询权威和管理数据集。
美国国家环境信息中心(NCEI)维护着一个气候数据集,这个数据集是基于全球气象站的观测数据。 它是《全球历史气候网络日报》(GHCN-D)ーー一个地面站每日天气摘要的中央储存库。 它由数以百万计的有质量保证的观测数据组成,每天更新。
研究人员通过一个按年分隔存储的FTP服务器,以CSV格式提供天气数据。按年组织意味着一份完整的档案需要超过255个文件,传统上,一个研究人员要研究这个数据,需要把整个数据都下载到本地,为了保证使用最新的数据进行分析,他们必须每天重复下载这些数据。
解决方案
通过AWS与NOAA的大数据合作项目,现在可以在 AWS 上获得 GHCN d 数据集的每日快照。 这些数据可以通过 Amazon S3 bucket 公开访问。已这种方式获取数据有以下几个好处:
- 这些数据可以通过S3在全球范围内进行访问,用户无需完整下载数据才能使用,每个人都可使用相同的一致的副本。
- 减少了分析的时间,通过我们本次演示的Athena和Insight服务,可以立即开始分析
- 研究的成本降低了,研究人员无需架设服务器和Hadoop集群,一旦分析完成,可以随时关闭资源
本篇文章展示了一个使用Amazon S3,Amazon Athena,AWS Glue和Amazon QuickSight的工作流程,演示了人们从这个数据集中获取洞察力的速度。
本次工作流遵循以下工作步骤:
- 从NOAA桶中提取数据文件,并将数据作为表格提供
- 使用SQL查询表中的数据
- 演示如何通过查询创建表并将这些表存储在Amazon S3私有存储桶中来加速分析
- 将数据做可视化便于展示
工作流程
- 提取年度.csv文件并将其添加到Athena的表中
- 提取站点数据并将其添加到Athena的一个单独的表格
年度文件提取
完整的每日天气观测数据按年份组织在 Amazon S3桶的一个文件夹中。 Csv 格式。 数据的路径是 s3://noaa-ghcn-pds/csv/ 。
每个文件都以1763年开始的年份命名.csv并且存储直到当前年份。
进入Athena控制台,点击AWS Glue Data Catalogj进入Glue控制台,在右侧选择表菜单,选择手动添加表
设置一个表名称并添加一个数据库
再下一步选择另一个账户的其他路径,输入NOAA的公共存储桶位置 s3://noaa-ghcn-pds/csv/ 。
接下来定义Schema
添加以下列,使用string类型(字符串类型)
• id
• year_date
• element
• data_value
• m_flag
• q_flag
• s_flag
• obs_time
添加好后点击完成,返回到Athena控制台,可以在左侧看到创建好的表,这里有些准备工作要做。在运行我们的第一个Athena查询之前,要设置一个S3存储桶用于存放查询结果
与此同时,我们也创建一些文件夹用于数据存放
- [your_bucket_name]/stations_raw/
- [your_bucket_name]/ghcnblog/
- [your_bucket_name]/ghcnblog/stations/
- [your_bucket_name]/ghcnblog/allyears/
- [your_bucket_name]/ghcnblog/1836usa/
设置好之后,我们可以使用表预览来创建一条查询语句
运行查询可以看到我们的表中的数据
使用CATS加速查询
在刚才的查询中我们可以看到查询语句运行的速度不是很快,我们需要创建一个表使用CREATE TABLE AS SELECT (CTAS)来加速查询
原因是在这个过程中,我们只提取一次数据,并将提取的数据以列格式(Parquet)存储在私有的 Amazon S3 bucket 中
为了说明速度的提高,这里有两个例子:
- 一个查询计算所有不同的 id,也就是唯一的气象站,大约需要55秒,扫描大约88gb 的数据。
- 对转换后的数据进行同样的查询大约需要13秒钟,并扫描大约5gb 的数据。
接下来是步骤:
- 打开Athena控制台
- 创建一条新的查询语句,并把其中的存储桶名称替换成你自己的
/*converting data to Parquet and storing it in a private bucket*/
CREATE table ghcnblog.tblallyears_qa
WITH (
format='PARQUET', external_location='s3://[your-bucket-name]/ghcnblog/allyearsqa/'
) AS SELECT * FROM ghcnblog.tblallyears
WHERE q_flag = '';
注意将相应桶名称和表名称换成你刚才创建的。
运行后会看到有一个新的表出现在左侧的库里,接下来我们将会在这个新的表上继续工作
提取数据并把它添加到Athena的表中
站点文本文件包含有关气象站的信息,例如位置、国籍和 ID。 这些数据保存在一个独立的文件中,不同于每年的观察数据。 我们需要导入这些数据来观察天气观测的地理分布。 虽然处理这个文件有点复杂,但是将这些数据导入Athena的步骤与我们已经完成的相似。
为了导入这些数据我们将采取以下步骤:
1.下载 ghcnd-stations text file.
2.使用一个表格编辑器,例如Excel打开这个文件
3.另存为CSV文件
4.将这个csv文件上传到之前建立的 [your_bucket_name]/stations_raw/文件夹
5.使用Glue添加表格,就像我们之前做的那样
在添加列步骤添加以下列
• id
• latitude
• longitude
• elevation
• state
• name
• gsn_flag
• hcn_flag
• wmo_id
点击完成后我们看下表预览,可以看到数据已经导入成功
6.接下来依然使用CATS将数据存储为parquet格式
/*converting data to Parquet and storing it in a private bucket*/
CREATE table ghcnblog.tblghcnd_stations_qa
WITH (
format='PARQUET', external_location='s3://athena-cx-bucket/ghcnblog/stations/'
) AS SELECT * FROM ghcnblog.tblghcnd_stations
至此,我们已经准备好了数据并导入到Athena之中
简单数据分析
接下来我们将演示几个数据分析的例子
1.查询从1763年以来观测点的数量
SELECT count(*) AS Total_Number_of_Observations
FROM ghcnblog.tblallyears_qa;
2.查询地面站的数量
SELECT count(*) AS Total_Number_of_Stations
FROM ghcnblog.tblghcnd_stations_qa;
3.地球平均气象参数
下图显示了计算自1763年以来地球平均最高温度(摄氏度)、平均最低温度(摄氏度)和平均降雨量(毫米)查询。 在查询中,我们必须将数据值从 String 变量转换为 Real 变量。 我们还必须除以10,因为温度和降水量的测量值,是它们各自单位的十分之一。
有关这些细节和元素代码(TMIB、 TMAX 和 PRCP)的详细信息,请参阅自述文件。
SELECT element,
round(avg(CAST(data_value AS real)/10),2) AS value
FROM ghcnblog.tblallyears_qa
WHERE element IN ('TMIN', 'TMAX', 'PRCP')
GROUP BY element;
如果我们可以在这个数据集上运行简单的查询(比如这个查询) ,并接受结果是正确的,那将会非常方便。 前面的查询假设自1763年以来,全世界的气象站均匀平均地分布。 事实上,气象站的数量和分布随时间而变化。
4.可视化显示地球上气象站的数量增长情况
接下来我们要引入Amazon QuickSight.进行数据可视化展示,在实验前您必须配置好QuickSight,包含注册,授权QuickSight访问Athena和S3。
- 打开QuickSight控制台
- 点击最右上角,账户菜单选择管理QuickSight
- 选择安全性和权限,确保连接了S3和Athena
接着返回主菜单,选择新分析,然后选择新数据集,在下方数据源里选择Athena,输入我们在Athena创建的数据库名字ghcnblog,然后点击创建数据源
选择使用自定义SQL,输入以下语句
SELECT DISTINCT id AS numberofstations,
substr(year_date,1,4) as year
FROM ghcnblog.tblallyears_qa
GROUP BY substr(year_date,1,4), id
ORDER BY substr(year_date,1,4)
选择确认查询,并选择直接查询数据,点击Visualize,在可视化图表里选择折线图,把year数据作为X轴,把number_of_stations 作为值,即可得到一张全球气象站数量的增长曲线图
美国气象观测站数量分析
1836年数据集中美国第一次设立气象站。 为了深入了解美国观测的发展,我们从主数据源(tblallyears qa)中提取了美国数据的子集。 从1836年到2016年,这个数据集每30年收集一次数据。 此查询生成一个大数据集。 为了提高性能,使用前面描述的过程将查询保存为存储在 Amazon S3 bucket 中的表。 在Athena中执行以下语句。
CREATE TABLE ghcnblog.tbl1836every30thyear
WITH (
format='PARQUET',
external_location='s3://[your-bucket-name]/ghcnblog/1836every30years/'
) AS
SELECT TA.id as id, substr(TA.year_date,1,4) as year, TS.state, CAST(TS.longitude as real) as longitde, CAST(TS.latitude as real) as latitude, element, CAST(data_value as real) as data_value
FROM "ghcnblog".tblallyears_qa as TA, "ghcnblog".tblghcnd_stations_qa as TS
WHERE substr(TA.year_date,1,4) IN ('1836', '1866', '1896', '1926', '1956', '1986', '2016')
AND substr(TA.id,1,2) = 'US'
AND state <> 'PI'
AND TRIM(TA.id) = TRIM(TS.id)
GROUP BY TA.id, substr(TA.year_date,1,4), state, longitude, latitude, element, data_value;
然后在QuickSight中创建一个新的分析,使用创建好的新表作为数据源
并使用以下自定义SQL
SELECT DISTINCT(id) AS number_of_stations, year, state
FROM ghcnblog.tbl1836every30thyear
GROUP BY year, id, state
ORDER BY year
在接下来的可视化界面里,选择地球上的点作为图像类型,地理位置数据选择state,size选择气象站数量,并使用总数统计,颜色选择年份
通过自定义SQL也可以计算出美国每个州的平均温度等数据
总结
通过本文演示,我们了解到通过Athena,Glue和QuickSight这个产品组合,可以快速的构建一个可视化大数据分析平台,并且无需架设服务器和维护Hadoop集群。对于快速验证分析数据,作出商业决策是非常便利的。
同时这些服务的计费也都是通过分析的数据量来收取,大大降低了资源的闲置成本,在数据分析得出结果后还可以把数据进一步存放到成本更低的S3 Glacier中归档,进一步节省成本。
作者:光环云 陈昕
原文:查看原文