在本教程中,我们将下载公开发布的航班数据的原始 CSV 数据文件。 将该文件导入 HDInsight 群集存储,然后使用 Azure HDInsight 中的 Interactive Query 来转换数据。 数据转换完毕后,使用 Apache Sqoop 将数据加载到 Azure SQL 数据库中的某个数据库中。
本教程涵盖以下任务:
- 下载示例航班数据
- 将数据上传到 HDInsight 群集
- 使用交互式查询转换数据
- 在 Azure SQL 数据库的某个数据库中创建表
- 使用 Sqoop 将数据导出到 Azure SQL 数据库中的某个数据库
先决条件
- HDInsight 上的一个交互式查询群集。 请参阅使用 Azure 门户创建 Apache Hadoop 群集,并选择“交互式查询”作为群集类型。 
- Azure SQL 数据库中的数据库。 使用数据库作为目标数据存储。 如果 Azure SQL 数据库中没有数据库,请参阅通过 Azure 门户在 Azure SQL 数据库中创建数据库。 
- SSH 客户端。 有关详细信息,请参阅使用 SSH 连接到 HDInsight (Apache Hadoop)。 
下载航班数据
- 在页面上,清除所有字段,然后选择以下值: - 名称 - 值 - 筛选年份 - 2019 - 筛选期间 - 1 月 - 字段 - Year, FlightDate, Reporting_Airline, DOT_ID_Reporting_Airline, Flight_Number_Reporting_Airline, OriginAirportID, Origin, OriginCityName, OriginState, DestAirportID, Dest, DestCityName, DestState, DepDelayMinutes, ArrDelay, ArrDelayMinutes, CarrierDelay, WeatherDelay, NASDelay, SecurityDelay, LateAircraftDelay。
- 选择“下载” 。 将下载一个包含所选数据字段的 .zip 文件。 
将数据上传到 HDInsight 群集
可通过多种方式将数据上传到与 HDInsight 群集相关的存储。 本部分使用 scp 上传数据。 若要了解上传数据的其他方式,请参阅将数据上传到 HDInsight。
- 将 .zip 文件上传到 HDInsight 群集头节点。 编辑以下命令,将 - FILENAME替换为 .zip 文件的名称,将- CLUSTERNAME替换为 HDInsight 群集的名称。 然后打开命令提示符,将工作目录设置为文件位置,然后输入命令:- scp FILENAME.zip sshuser@CLUSTERNAME-ssh.azurehdinsight.cn:FILENAME.zip- 如果出现提示,请输入“yes”或“no”以继续。 键入时,文本在窗口中不可见。 
- 上传完成后,使用 SSH 连接到群集。 通过将 - CLUSTERNAME替换为 HDInsight 群集的名称来编辑以下命令。 然后输入以下命令:- ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.cn
- 建立 SSH 连接后设置环境变量。 将 - FILE_NAME、- SQL_SERVERNAME、- SQL_DATABASE、- SQL_USER和- SQL_PASWORD替换为适当的值。 然后输入该命令:- export FILENAME=FILE_NAME export SQLSERVERNAME=SQL_SERVERNAME export DATABASE=SQL_DATABASE export SQLUSER=SQL_USER export SQLPASWORD='SQL_PASWORD'
- 通过输入以下命令解压缩 .zip 文件: - unzip $FILENAME.zip
- 在 HDInsight 存储上创建目录,然后输入以下命令将 .csv 文件复制到该目录: - hdfs dfs -mkdir -p /tutorials/flightdelays/data hdfs dfs -put $FILENAME.csv /tutorials/flightdelays/data/
使用 Hive 查询转换数据
可通过多种方式在 HDInsight 群集上运行 Hive 作业。 本部分使用 Beeline 运行 Hive 作业。 有关以其他方式运行 Hive 作业的信息,请参阅在 HDInsight 上使用 Apache Hive。
在 Hive 作业运行期间,请将 .csv 文件中的数据导入到名为“Delays”的 Hive 表中。
- 在 HDInsight 群集已有的 SSH 提示符中,使用以下命令创建并编辑名为“flightdelays.hql”的新文件: - nano flightdelays.hql
- 将以下文本用作此文件的内容: - DROP TABLE delays_raw; -- Creates an external table over the csv file CREATE EXTERNAL TABLE delays_raw ( YEAR string, FL_DATE string, UNIQUE_CARRIER string, CARRIER string, FL_NUM string, ORIGIN_AIRPORT_ID string, ORIGIN string, ORIGIN_CITY_NAME string, ORIGIN_CITY_NAME_TEMP string, ORIGIN_STATE_ABR string, DEST_AIRPORT_ID string, DEST string, DEST_CITY_NAME string, DEST_CITY_NAME_TEMP string, DEST_STATE_ABR string, DEP_DELAY_NEW float, ARR_DELAY_NEW float, CARRIER_DELAY float, WEATHER_DELAY float, NAS_DELAY float, SECURITY_DELAY float, LATE_AIRCRAFT_DELAY float) -- The following lines describe the format and location of the file ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '/tutorials/flightdelays/data'; -- Drop the delays table if it exists DROP TABLE delays; -- Create the delays table and populate it with data -- pulled in from the CSV file (via the external table defined previously) CREATE TABLE delays AS SELECT YEAR AS year, FL_DATE AS flight_date, substring(UNIQUE_CARRIER, 2, length(UNIQUE_CARRIER) -1) AS unique_carrier, substring(CARRIER, 2, length(CARRIER) -1) AS carrier, substring(FL_NUM, 2, length(FL_NUM) -1) AS flight_num, ORIGIN_AIRPORT_ID AS origin_airport_id, substring(ORIGIN, 2, length(ORIGIN) -1) AS origin_airport_code, substring(ORIGIN_CITY_NAME, 2) AS origin_city_name, substring(ORIGIN_STATE_ABR, 2, length(ORIGIN_STATE_ABR) -1) AS origin_state_abr, DEST_AIRPORT_ID AS dest_airport_id, substring(DEST, 2, length(DEST) -1) AS dest_airport_code, substring(DEST_CITY_NAME,2) AS dest_city_name, substring(DEST_STATE_ABR, 2, length(DEST_STATE_ABR) -1) AS dest_state_abr, DEP_DELAY_NEW AS dep_delay_new, ARR_DELAY_NEW AS arr_delay_new, CARRIER_DELAY AS carrier_delay, WEATHER_DELAY AS weather_delay, NAS_DELAY AS nas_delay, SECURITY_DELAY AS security_delay, LATE_AIRCRAFT_DELAY AS late_aircraft_delay FROM delays_raw;
- 若要保存该文件,请按“Ctrl + X”,然后按“y”,然后输入 。 
- 若要启动 Hive 并运行 flightdelays.hql 文件,请使用以下命令: - beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http' -f flightdelays.hql
- flightdelays.hql 脚本完成运行后,使用以下命令打开交互式 Beeline 会话: - beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http'
- 收到 - jdbc:hive2://localhost:10001/>提示时,使用以下查询从导入的航班延误数据中检索数据:- INSERT OVERWRITE DIRECTORY '/tutorials/flightdelays/output' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' SELECT regexp_replace(origin_city_name, '''', ''), avg(weather_delay) FROM delays WHERE weather_delay IS NOT NULL GROUP BY origin_city_name;- 此查询会检索遇到天气延迟的城市的列表以及平均延迟时间,并将其保存到 - /tutorials/flightdelays/output中。 稍后,Sqoop 会从该位置读取数据并将其导出到 Azure SQL 数据库。
- 若要退出 Beeline,请在提示符处输入 - !quit。
创建 SQL 数据库表
可通过多种方式连接到 SQL 数据库并创建表。 以下步骤从 HDInsight 群集使用 FreeTDS 。
- 若要安装 FreeTDS,请使用以下命令从打开的 SSH 连接到群集: - sudo apt-get --assume-yes install freetds-dev freetds-bin
- 安装完成后,使用以下命令连接到 SQL 数据库: - TDSVER=8.0 tsql -H $SQLSERVERNAME.database.chinacloudapi.cn -U $SQLUSER -p 1433 -D $DATABASE -P $SQLPASWORD- 将收到类似于以下文本的输出: - locale is "en_US.UTF-8" locale charset is "UTF-8" using default charset "UTF-8" Default database being set to <yourdatabase> 1>
- 在 - 1>提示符下,输入以下行:- CREATE TABLE [dbo].[delays]( [origin_city_name] [nvarchar](50) NOT NULL, [weather_delay] float, CONSTRAINT [PK_delays] PRIMARY KEY CLUSTERED ([origin_city_name] ASC)) GO- 输入 - GO语句后,会评估前面的语句。 此语句会创建一个名为“delays”且具有聚集索引的表。- 使用以下查询验证是否已创建该表: - SELECT * FROM information_schema.tables GO- 输出与以下文本类似: - TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE databaseName dbo delays BASE TABLE
- 在 - 1>提示符下输入- exit以退出 tsql 实用工具。
使用 Apache Sqoop 将数据导出到 SQL 数据库
在前面的部分中,已经在 /tutorials/flightdelays/output 复制了转换后的数据。 在本部分中,你将使用 Sqoop 将数据从 /tutorials/flightdelays/output 导出到在 Azure SQL 数据库中创建的表。
- 通过输入以下命令验证 Sqoop 是否可以查看 SQL 数据库: - sqoop list-databases --connect jdbc:sqlserver://$SQLSERVERNAME.database.chinacloudapi.cn:1433 --username $SQLUSER --password $SQLPASWORD- 此命令会返回数据库列表,其中包括此前创建的 - delays表所在的数据库。
- 通过输入以下命令将数据从 - /tutorials/flightdelays/output导出到- delays表:- sqoop export --connect "jdbc:sqlserver://$SQLSERVERNAME.database.chinacloudapi.cn:1433;database=$DATABASE" --username $SQLUSER --password $SQLPASWORD --table 'delays' --export-dir '/tutorials/flightdelays/output' --fields-terminated-by '\t' -m 1- Sqoop 连接到包含 - delays表的数据库,并将数据从- /tutorials/flightdelays/output目录导出到- delays表。
- Sqoop 命令完成后,使用 tsql 实用程序通过输入以下命令连接到数据库: - TDSVER=8.0 tsql -H $SQLSERVERNAME.database.chinacloudapi.cn -U $SQLUSER -p 1433 -D $DATABASE -P $SQLPASWORD- 使用以下语句验证数据是否已导出到 delays 表: - SELECT * FROM delays GO- 会在表中看到一系列数据。 该表包括城市名称和该城市的平均航班延迟时间。 - 键入 - exit退出 tsql 实用工具。
清理资源
完成本教程后,可以删除群集。 有了 HDInsight,便可以将数据存储在 Azure 存储中,因此可以在群集不用时安全地删除群集。 此外,还需要为 HDInsight 群集付费,即使不用也是如此。 由于群集费用数倍于存储空间费用,因此在群集不用时删除群集可以节省费用。
若要删除群集,请参阅使用浏览器、PowerShell 或 Azure CLI 删除 HDInsight 群集。
后续步骤
在本教程中,你获取了一个原始 CSV 数据文件,将其导入到 HDInsight 群集存储中,然后使用 Azure HDInsight 中的交互式查询转换数据。 继续学习下一篇教程,了解 Apache Hive Warehouse Connector。