在上一节中,我们创建了S3存储桶,并在input目录上传了JC-202202-citibike-tripdata.csv
文件。在这一节中,将继续使用此S3桶, 并使用EMR集群的Hive进行SQL查询。
SSH到EMR Primray节点。在命令行中,执行hive
进入交互式界面:
在Hive CLI中,我们将创建一张外部表(external table)
叫做trip_test
,来指向之前上传的JC-202202-citibike-tripdata.csv
数据集。运行以下的DDL语句来创建外部表,将<YOUR-BUCKET>
替换为上一步创建的S3桶名称:
CREATE EXTERNAL TABLE trip_test (
ride_id string,
rideable_type string,
started_at string ,
ended_at string,
start_station_name string,
start_station_id string,
end_station_name string,
end_station_id string,
start_lat double,
start_lng double,
end_lat double,
end_lng double,
member_casual string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION "s3://<YOUR-BUCKET>/input/";
使用SQL语句查询该表。例如输出所有的start_station_name
:
SELECT DISTINCT start_station_name FROM trip_test;
我们继续使用**HiveQL (HQL)**来操作Hive,这个HQL文件将通过EMR Steps
来提交,并将运行结果保存到S3
将以下代码保存为trip.hql
,将其上传之前创建的S3桶的files
目录下:
CREATE EXTERNAL TABLE trip (
ride_id string,
rideable_type string,
started_at string ,
ended_at string,
start_station_name string,
start_station_id string,
end_station_name string,
end_station_id string,
start_lat double,
start_lng double,
end_lat double,
end_lng double,
member_casual string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION "${INPUT}";
INSERT OVERWRITE DIRECTORY "${OUTPUT}" SELECT * FROM trip WHERE start_station_name = "Christ Hospital";
aws s3 cp trip.hql s3://<bucket-name>/files/
这个 HiveQL 文件将:
创建一张外部表 trip
,数据源指向之前的JC-202202-citibike-tripdata.csv
文件。
查询 trip
表的start_station_name
。
将结果保存到路径${OUTPUT}
,这个路径在提交step的时候指定。
现在将这个HQL文件以Step的方式提交到EMR。 在EMR集群的界面上,点击添加步骤:
在步骤类型中,选择Hive Program
, 相关配置如下:
脚本S3位置: s3://<YOUR-BUCKET>/files/trip.hql
输入S3 位置: 不需要指定S3文件完整路径,因为Hive会读取目录下的所有文件。 路径为 s3://<YOUR-BUCKET>/input/
输出 S3位置: 存储Hive执行结果。路径为: s3://<YOUR-BUCKET>/output/hive/
其他配置不用更改,点击 添加
在点击添加后,HQL脚本会接着被执行,在几分钟过后检查S3/output/hive/
目录,可以看到结果文件。