
# 从零开始使用Spark SQL
Spark提供类似SQL的Spark SQL语言操作结构化数据，本章节提供从零开始使用Spark SQL，创建一个名称为src_data的表，然后在src_data表中每行写入一条数据，最后将数据存储在"mrs_20160907"集群中。再使用SQL语句查询src_data表中的数据，最后可将src_data表删除。
 #### 前提条件
将OBS数据源中的数据写入Spark SQL表中时，需要先获取AK/SK。获取方法如下：
1. 登录管理控制台。
2. 单击用户名，在下拉列表中单击"我的凭证"。
3. 单击"访问密钥"。
4. 单击"新增访问密钥"，进入"新增访问密钥"页面。
5. 输入登录密码和短信验证码，单击"确定"，下载密钥，请妥善保。
 
#### 操作步骤
1. 准备使用Spark SQL分析的数据源。 
   样例txt文件如下：
   ```
   abcd3ghji
   efgh658ko
   1234jjyu9
   7h8kodfg1
   kk99icxz3
   ```
   
   
2. 上传数据至OBS。 
   1. 登录OBS控制台。
   
   2. 单击"并行文件系统 \> 创建并行文件系统"，创建一个名称为sparksql的文件系统。 sparksql仅为示例，文件系统名称必须全局唯一，否则会创建并行文件系统失败。
      
   
   3. 单击sparksql文件系统名称，并选择"文件"。
   
   4. 单击"新建文件夹"，创建input文件夹。
   
   5. 进入input文件夹，单击"上传文件 \> 添加文件"，选择本地的txt文件，然后单击"上传"。
   
   
   
   
3. 登录MRS控制台，在左侧导航栏选择"现有集群"，单击集群名称。
4. 将OBS中的txt文件导入至HDFS中。 
   1. 选择"文件管理"。
   
   2. 在"HDFS文件列表"页签中单击"新建"，创建一个名称为userinput的文件夹。
   
   3. 进入userinput文件夹，单击"导入数据"。
   
   4. 选择OBS和HDFS路径，单击"确定"。 OBS路径：obs://sparksql/input/sparksql-test.txt
      HDFS路径：/user/userinput
      图1从OBS导入数据至HDFS   
      ![](https://support.huaweicloud.com/cmpntguide-mrs/zh-cn_image_0000001164661964.png) 
   
   
   
   
5. 提交Spark SQL语句。 
   1. 在MRS控制台选择"作业管理"，具体请参见[运行Spark作业](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0524.html)。
      只有"mrs_20160907"集群处于"运行中"状态时才能提交Spark SQL语句。
      
   
   2. 输入创建表的Spark SQL语句。 输入Spark SQL语句时，总字符数应当小于或等于10000字符，否则会提交语句失败。
      语法格式：
      **CREATE** \[EXTERNAL\] **TABLE** \[IF NOT EXISTS\] *table_name* \[(col_name data_type \[COMMENT col_comment\], ...)\] \[COMMENT table_comment\] \[PARTITIONED **BY** (col_name data_type \[COMMENT col_comment\], ...)\] \[CLUSTERED **BY** (col_name, col_name, ...) \[SORTED **BY** (col_name \[ASC\|DESC\], ...)\] INTO num_buckets BUCKETS\] \[ROW FORMAT row_format\] \[STORED **AS** file_format\] \[LOCATION hdfs_path\];
      创建表样例存在以下两种方式。
      - 方式一：创建一个src_data表，将数据源中的数据一行一行写入src_data表中。
        - 数据源存储在HDFS的"/user/omm/userinput"文件夹下：*create external table* *src_data* *(line string) row format delimited fields terminated by '\\n' stored as textfile location* '*/user/* *omm/* *userinput*';
        
        - 数据源存储在OBS的"/sparksql/input"文件夹下：**create external table** *src_data* **(line string) row format delimited fields terminated by '\\\\n' stored as textfile location** '*obs://AK:SK@sparksql/input* ';
          AK/SK获取方法，请参见[前提条件]。
          
         
      
      - 方式二：创建一个表src_data1，将数据源中的数据批量load到src_data1表中。 **create table** *src_data1* **(line string) row format delimited fields terminated by ','** ;
        **load data inpath** '*/user/* *omm/* *userinput/sparksql-test.txt* ' **into table** *src_data1*;
        
      
      
      ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
      采用方式二时，只能将HDFS上的数据load到新建的表中，OBS上的数据不支持直接load到新建的表中。
      
   
   3. 输入查询表的Spark SQL语句。 语法格式：
      **SELECT** col_name **FROM** *table_name*;
      查询表样例，查询src_data表中的所有数据：
      *select * from src_data;*
      
   
   4. 输入删除表的Spark SQL语句。 语法格式：
      **DROP TABLE** \[IF EXISTS\] *table_name*;
      删除表样例：
      *drop table src_data;*
      
   
   5. 单击"检查"，检查输入语句的语法是否正确。
   
   6. 单击"确定"。 Spark SQL语句提交后，是否执行成功会在"执行结果"列中展示。
      
   
   
   
   
6. 删除集群。
 
