在 HDInsight 中的 Spark 群集上运行交互式查询

了解如何使用 Jupyter Notebook 针对 Spark 群集运行交互式 Spark SQL 查询。

Jupyter Notebook 是一个基于浏览器的应用程序,它将基于控制台的交互式体验扩展到 Web。 Spark on HDInsight 还包括 Zeppelin Notebook。 本教程使用 Jupyter Notebook。

HDInsight 群集上的 Jupyter Notebook 支持三种内核:PySparkPySpark3Spark。 本教程使用 PySpark 内核。 有关内核的详细信息以及使用 PySpark 的好处,请参阅将 Jupyter Notebook 内核与 HDInsight 中的 Apache Spark 群集配合使用。 若要使用 Zeppelin Notebook,请参阅在 Azure HDInsight 上的 Apache Spark 群集中使用 Zeppelin Notebook

在本教程中,我们要查询某个 csv 文件中的数据。 必须首先将该数据作为数据帧加载到 Spark 中。 然后可以使用 Jupyter Notebook 针对数据帧运行查询。

先决条件

从 csv 文件创建数据帧

使用 SQLContext,应用程序可从现有 RDD、Hive 表或数据源创建数据帧。

从 csv 文件创建数据帧

  1. 使用 PySpark 创建一个 Jupyter Notebook(如果没有)。 有关说明,请参阅创建 Jupyter Notebook

  2. 在 Notebook 的空单元格中粘贴以下代码,然后按 SHIFT + ENTER 运行这些代码。 该代码导入此方案所需的类型:

    from pyspark.sql import *
    from pyspark.sql.types import *
    

    如果使用 PySpark 内核创建 Notebook,在运行第一个代码单元格时,系统会自动创建 Spark 和 Hive 上下文。 不需要显式创建任何上下文。

    在 Jupyter 中运行交互式查询时,Web 浏览器窗口或选项卡标题中会显示“(繁忙)”状态和 Notebook 标题。 右上角“PySpark”文本的旁边还会出现一个实心圆。 作业完成后,实心圆将变成空心圆。

    交互式 Spark SQL 查询的状态

  3. 运行以下代码创建数据帧和临时表 (hvac):该代码不会提取 CSV 文件中的所有列。

    # Create an RDD from sample data
    hvacText = sc.textFile("wasbs:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv")
    
    # Create a schema for our data
    Entry = Row('Date', 'Time', 'TargetTemp', 'ActualTemp', 'BuildingID')
    
    # Parse the data and create a schema
    hvacParts = hvacText.map(lambda s: s.split(',')).filter(lambda s: s[0] != 'Date')
    hvac = hvacParts.map(lambda p: Entry(str(p[0]), str(p[1]), int(p[2]), int(p[3]), int(p[6])))
    
    # Infer the schema and create a table       
    hvacTable = sqlContext.createDataFrame(hvac)
    hvacTable.registerTempTable('hvactemptable')
    dfw = DataFrameWriter(hvacTable)
    dfw.saveAsTable('hvac')
    

    以下屏幕截图显示 HVAC.csv 文件的快照。 所有 HDInsigt Spark 群集都随附了该 csv 文件。 该数据捕获了某栋建筑物的温度变化。

    交互式 Spark SQL 查询的数据快照

对数据帧运行查询

创建表后,可以针对数据运行交互式查询。

运行查询

  1. 在 Notebook 的空单元格中运行以下代码:

    %%sql
    SELECT buildingID, (targettemp - actualtemp) AS temp_diff, date FROM hvac WHERE date = \"6/1/13\"
    

    由于在 Notebook 中使用了 PySpark 内核,因此现在可直接对使用 %%sql magic 创建的临时表 hvac 运行交互式 SQL 查询。 有关 %%sql magic 以及可在 PySpark 内核中使用的其他 magic 的详细信息,请参阅包含 Spark HDInsight 群集的 Jupyter Notebook 上可用的内核

    默认情况下,显示以下表格输出。

    交互式 Spark 查询结果的表输出

  2. 也可以在其他视觉效果中查看结果。 若要查看相同输出的面积图,请选择“面积”,然后设置其他值,如下所示。

    交互式 Spark 查询结果的面积图

  3. 在笔记本的“文件”菜单中,单击“保存和检查点”。

  4. 如果现在开始下一教程,请使笔记本保持打开状态。 否则,关闭笔记本以释放群集资源:在笔记本的“文件”菜单中,单击“关闭并停止”。

后续步骤

在本文中,你已学习了如何使用 Jupyter notebook 在 Spark 中运行交互式查询。 请前进到下一文章来了解如何将在 Spark 中注册的数据拉取到诸如 Power BI 和 Tableau 的 BI 分析工具中。