Synapse 笔记本是一种 Web 界面,用于创建包含实时代码、可视化效果和叙述性文本的文件。 笔记本是验证想法并使用快速试验从数据中获取见解的好地方。 笔记本还广泛用于数据准备、数据可视化、机器学习和其他大数据方案。

使用 Synapse 笔记本,可以:

  • 无需设置即可开始工作。
  • 利用内置企业安全功能确保数据安全。
  • 针对 Spark 和 SQL,分析跨原始格式(CSV、txt、JSON 等)、已处理的文件格式(parquet、Delta Lake、ORC 等)以及 SQL 表格数据文件的数据。
  • 利用增强的创作功能和内置的数据可视化功能提高工作效率。
  • 本文介绍如何在 Synapse Studio 中使用笔记本。

    创建笔记本

    可通过两种方法创建笔记本。 可以从“对象资源管理器”创建新笔记本或将现有笔记本导入到 Synapse 工作区。 Synapse 笔记本可识别标准 Jupyter Notebook IPYNB 文件。

    开发笔记本

    笔记本由单元格组成,单元格是单独的代码块或可单独运行或作为组运行的文本块。

    我们提供有丰富的操作供你开发笔记本:

  • 添加单元格
  • 设置主要语言
  • 使用多种语言
  • 使用临时表跨语言引用数据
  • IDE 样式 IntelliSense
  • 通过工具栏按钮设置文本单元格的格式
  • 撤消/重做单元格操作
  • 代码单元格注释
  • 移动单元格
  • 删除单元格
  • 折叠单元格输入
  • 折叠单元格输出
  • 笔记本大纲
  • 添加单元格

    有多种方法可向笔记本添加新单元格。

  • 将鼠标悬停在两个单元格之间的空白地方,然后选择“代码”或“Markdown” 。

  • 使用 aznb 命令模式下的快捷键 。 按 A 在当前单元格上方插入单元格。 按 B 在当前单元格下方插入单元格。

    设置主要语言

    Synapse 笔记本支持四种 Apache Spark 语言:

  • PySpark (Python)
  • Spark (Scala)
  • Spark SQL
  • .NET Spark (C#)
  • SparkR (R)
  • 可以从顶部命令栏中的下拉列表为新添加的单元格设置主要语言。

    使用多种语言

    通过在单元格开始位置指定正确的语言 magic 命令,可以在一个笔记本中使用多种语言。 下表列出了用于切换单元格语言的 magic 命令。

    magic 命令

    下图是一个示例,说明如何在 Spark(Scala) 笔记本中使用 %%pyspark magic 命令编写 PySpark 查询,或使用 %%sql magic 命令编写 SparkSQL 查询 。 请注意,笔记本的主要语言设置为 pySpark。

    使用临时表跨语言引用数据

    不能直接在 Synapse 笔记本中跨不同语言引用数据或变量。 在 Spark 中,可以跨语言引用临时表。 下面是一个示例,说明如何使用 Spark 临时表作为解决方法,在 PySpark SparkSQL 中读取 Scala 数据帧。

  • 在单元格 1 中,使用 Scala 从 SQL 池连接器读取 DataFrame,并创建一个临时表。

    %%spark
    val scalaDataFrame = spark.read.sqlanalytics("mySQLPoolDatabase.dbo.mySQLPoolTable")
    scalaDataFrame.createOrReplaceTempView( "mydataframetable" )
    
  • 在单元格 2 中,使用 Spark SQL 查询数据。

    %%sql
    SELECT * FROM mydataframetable
    
  • 在单元格 3 中,使用 PySpark 中的数据。

    %%pyspark
    myNewPythonDataFrame = spark.sql("SELECT * FROM mydataframetable")
    

    IDE 样式 IntelliSense

    Synapse 笔记本集成了 Monaco 编辑器,将 IDE 样式的 IntelliSense 引入到了单元格编辑器中。 语法突出显示、错误标记和自动代码补全功能有助于你编写代码并更快地找出问题。

    对于不同的语言,IntelliSense 功能处于不同的成熟度级别。 请参阅下表了解支持的功能。

    Languages 语法突出显示 语法错误标记 语法代码补全 变量代码补全 系统函数代码补全 用户函数代码补全

    Synapse 笔记本提供代码片段,可更轻松地输入常用的代码模式,例如配置 Spark 会话、将数据作为 Spark 数据帧读取,或者使用 matplotlib 等绘制图表。

    代码片段与其他建议混合在一起显示在 IDE 样式 IntelliSense 的快捷键中。 代码片段内容与代码单元格语言一致。 可通过在代码单元格编辑器中键入“代码片段”或代码片段标题中出现的任何关键字来查看可用的代码片段。 例如,通过键入“读取”,可查看用于从各种数据源读取数据的代码片段列表。

    通过工具栏按钮设置文本单元格的格式

    可以使用文本单元格工具栏中的格式按钮执行常见的 markdown 操作。 它包括将文本设为粗体,通过下拉列表将文本、段落/标题设为斜体,插入代码,插入未排序列表,插入已排序列表,插入超链接以及插入 URL 中的图像。

    撤消/重做单元格操作

    选择“撤消 / 重做”按钮或按 Z / Shift+Z 可撤销最近的单元格操作 。 现在可以撤消/重做最近的 10 个历史单元格操作。

    支持的撤消单元格操作:

  • 插入/删除单元格:可以通过选择“撤消”来撤销删除操作,文本内容将与单元格一起保留。
  • 对单元格进行重新排序。
  • 切换参数。
  • 在代码单元格和 Markdown 单元格之间进行转换。
  • 单元格内文本操作和代码单元格注释操作是不可撤消的。 现在可以撤消/重做最近的 10 个历史单元格操作。

    代码单元格注释

  • 在笔记本工具栏上选择“注释”按钮以打开“注释”窗格 。

  • 在代码单元格中选择代码,单击“注释”窗格中的“新建”,添加注释,然后单击“发布注释”按钮以保存 。

  • 可以通过单击注释旁的“更多”按钮来执行“编辑注释”、“解析线程”或“删除线程”的操作 。

    笔记本大纲

    大纲(目录)在边栏窗口中显示任何 markdown 单元的第一个 markdown 标题,用于快速导航。 大纲边栏可根据最适合屏幕的方式调整大小和折叠。 你可以选择笔记本命令栏上的“大纲”按钮,以打开或隐藏边栏

    运行笔记本

    你可以逐个或同时在笔记本中运行代码单元格。 每个单元格的状态和进度都在笔记本中表示。

    运行单元格

    可以通过多种方法在单元格中运行代码。

  • 将鼠标悬停在要运行的单元格上,并选择“运行单元格”按钮,或按 Ctrl+Enter 。

  • 使用命令模式下的快捷键。 按 Shift+Enter 运行当前单元格并选择下面的单元格。 按 Alt+Enter 运行当前单元格并在下面插入一个新单元格。

    运行所有单元格

    选择“全部运行”按钮,按顺序运行当前笔记本中的所有单元格。

    运行上方或下方的所有单元格

    展开“全部运行”中的下拉列表,然后选择“运行上面的单元”,按顺序运行当前单元格上方的所有单元格。 选择“运行下方的单元格”,按顺序运行当前单元格下方的所有单元格。

    取消所有正在运行的单元格

    选择“全部取消”按钮可取消正在运行的单元格或在队列中等待的单元格。

    笔记本引用

    可以使用 %run <notebook path> magic 命令在当前笔记本上下文中引用另一个笔记本。 引用笔记本中定义的所有变量在当前笔记本中都可用。 %run magic 命令支持嵌套调用,但不支持递归调用。 如果语句超过五行,你将收到异常。

    示例:%run /<path>/Notebook1 { "parameterInt": 1, "parameterFloat": 2.5, "parameterBool": true, "parameterString": "abc" }

    可以在交互模式和 Synapse 管道中使用笔记本引用。

  • %run 命令当前只支持将绝对路径或笔记本名称仅作为参数传递,不支持相对路径。
  • %run 命令当前仅支持 4 种参数值类型:intfloatboolstring,不支持变量替换操作。
  • 需要发布引用的笔记本。 除非启用引用未发布的笔记本,否则需要发布笔记本来引用它们。 Synapse Studio无法识别 Git 存储库中未发布的笔记本。
  • 引用的笔记本不支持超过五行的语句。
  • 变量资源管理器

    Synapse 笔记本提供内置的变量资源管理器,让你可以在 PySpark (Python) 单元的当前 Spark 会话中查看变量名称、类型、长度和值的列表。 在代码单元中定义多个变量时,系统会自动显示它们。 单击每个列标题时,表中的变量会进行排序。

    你可以选择笔记本命令栏上的“变量”按钮,以打开或隐藏变量资源管理器。

    变量资源管理器仅支持 Python。

    单元格状态指示器

    逐步单元格执行状态显示在单元格下方,有助于你查看其当前进度。 单元格运行完成后,将显示具有总持续时间和结束时间的执行摘要,并将其保留在此处供将来参考。

    Spark 进度指示器

    Synapse 笔记本仅基于 Spark。 代码单元格在无服务器 Apache Spark 池上远程执行。 Spark 作业进度指示器提供有实时进度栏,可帮助你了解作业执行状态。 每个作业或阶段的任务数有助于识别 spark 作业的并行级别。 还可选择作业(或阶段)名称上的链接,来更深入地了解特定作业(或阶段)的 Spark UI。

    Spark 会话配置

    可以在“配置会话”中为当前 Spark 会话指定超时持续时间、数量和执行器的大小。 重启 Spark 会话,以使配置更改生效。 缓存的所有笔记本变量都将被清除。

    还可以从 Apache Spark 配置创建配置,或选择现有配置。 有关详细信息,请参阅 Apache Spark 配置管理

    Spark 会话配置 magic 命令

    还可以通过 magic 命令 %%configure 指定 spark 会话设置。 spark 会话需要重启才能使设置生效。 建议你在笔记本开头运行 %%configure。 下面是一个示例,有关有效参数的完整列表,请参阅 https://github.com/cloudera/livy#request-body

    %%configure
        //You can get a list of valid parameters to config the session from https://github.com/cloudera/livy#request-body.
        "driverMemory":"28g", // Recommended values: ["28g", "56g", "112g", "224g", "400g", "472g"]
        "driverCores":4, // Recommended values: [4, 8, 16, 32, 64, 80]
        "executorMemory":"28g",
        "executorCores":4, 
        "jars":["abfs[s]://<file_system>@<account_name>.dfs.core.windows.net/<path>/myjar.jar","wasb[s]://<containername>@<accountname>.blob.core.windows.net/<path>/myjar1.jar"],
        "conf":{
        //Example of standard spark property, to find more available properties please visit:https://spark.apache.org/docs/latest/configuration.html#application-properties.
            "spark.driver.maxResultSize":"10g",
        //Example of customized property, you can specify count of lines that Spark SQL returns by configuring "livy.rsc.sql.num-rows".
            "livy.rsc.sql.num-rows":"3000" 
    
  • 建议在 %%configure 中将“DriverMemory”和“ExecutorMemory”设置为相同的值,对“driverCores”和“executorCores”也进行同样的设置。
  • 可以在 Synapse 管道中使用 %%configure,但如果未在第一个代码单元格中设置它,管道运行将因无法重新启动会话而失败。
  • 在 mssparkutils.notebook.run 中使用的 %%configure 将被忽略,但在 %run 笔记本中使用的将继续执行。
  • 必须在“conf”正文中使用标准 Spark 配置属性。 不支持 Spark 配置属性的第一级引用。
  • 包括“spark.driver.cores”、“spark.executor.cores”、“spark.driver.memory”、“spark.executor.memory”和“spark.executor.instances”在内等某些特殊的 spark 属性不会在“conf”正文中生效。
  • 管道中的参数化会话配置

    参数化会话配置使你能够将 %%configure magic 中的值替换为管道运行(笔记本活动)参数。 在准备 %%configure 代码单元格时,可以使用如下所示的一个对象来替代默认值(也可配置,即下面示例中的 4 和“2000”):

    "activityParameterName": "paramterNameInPipelineNotebookActivity", "defaultValue": "defaultValueIfNoParamterFromPipelineNotebookActivity"
    %%configure  
        "driverCores": 
            "activityParameterName": "driverCoresFromNotebookActivity", 
            "defaultValue": 4 
        "conf": 
            "livy.rsc.sql.num-rows": 
                "activityParameterName": "rows", 
                "defaultValue": "2000" 
    

    如果直接在交互模式下运行笔记本或者未从管道笔记本活动提供与“activityParameterName”匹配的参数,笔记本将使用默认值。

    在管道运行模式期间,可以按如下所示配置管道笔记本活动设置:参数化会话配置的屏幕截图

    如果要更改会话配置,管道笔记本活动参数名称应与笔记本中的 activityParameterName 相同。 运行此管道时,此示例中 %%configure 中的 driverCores 将替换为 8,livy.rsc.sql.num-rows 将替换为 4000。

    如果由于使用此新的 %%configure magic 而导致运行管道失败,可以通过在笔记本的交互模式下运行 %%configure magic 单元格来检查更多错误信息。

    将数据引入笔记本

    如以下代码示例所示,可以从 Azure Blob 存储、Azure Data Lake Store Gen 2 和 SQL 池加载数据。

    从 Azure Data Lake Store Gen2 读取 CSV 作为 Spark 数据帧

    from pyspark.sql import SparkSession
    from pyspark.sql.types import *
    account_name = "Your account name"
    container_name = "Your container name"
    relative_path = "Your path"
    adls_path = 'abfss://%s@%s.dfs.core.windows.net/%s' % (container_name, account_name, relative_path)
    df1 = spark.read.option('header', 'true') \
                    .option('delimiter', ',') \
                    .csv(adls_path + '/Testfile.csv')
    

    从 Azure Blob 存储读取 CSV 作为 Spark 数据帧

    from pyspark.sql import SparkSession # Azure storage access info blob_account_name = 'Your account name' # replace with your blob name blob_container_name = 'Your container name' # replace with your container name blob_relative_path = 'Your path' # replace with your relative folder path linked_service_name = 'Your linked service name' # replace with your linked service name blob_sas_token = mssparkutils.credentials.getConnectionStringOrCreds(linked_service_name) # Allow SPARK to access from Blob remotely wasb_path = 'wasbs://%s@%s.blob.core.windows.net/%s' % (blob_container_name, blob_account_name, blob_relative_path) spark.conf.set('fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name), blob_sas_token) print('Remote blob path: ' + wasb_path) df = spark.read.option("header", "true") \ .option("delimiter","|") \ .schema(schema) \ .csv(wasbs_path)

    从主存储帐户读取数据

    你可以直接访问主存储帐户中的数据。 无需提供密钥。 在数据资源管理器中,右键单击某个文件,然后选择“新建笔记本”以查看自动生成了数据提取器的新笔记本。

    IPython 小组件

    小组件是事件化的 python 对象,在浏览器中具有表示形式,通常作为控件(例如滑块、文本框等)提供。IPython 小组件仅适用于 Python 环境,在其他语言(例如 Scala、SQL、C#)中尚不受支持。

    使用 IPython 小组件

  • 需要首先导入 ipywidgets 模块才能使用 Jupyter 小组件框架。

    import ipywidgets as widgets
    
  • 你可以使用顶级 display 函数来呈现小组件,或者在代码单元格的最后一行保留 widget 类型的表达式。

    slider = widgets.IntSlider()
    display(slider)
    
    slider = widgets.IntSlider()
    slider
    
  • 运行单元格,小组件将显示在输出区域。

  • 你可以使用多个 display() 调用来多次呈现同一小组件实例,但它们会相互保持同步。

    slider = widgets.IntSlider()
    display(slider)
    display(slider)
    
  • 若要呈现两个彼此独立的小组件,请创建两个小组件实例:

    slider1 = widgets.IntSlider()
    slider2 = widgets.IntSlider()
    display(slider1)
    display(slider2)
    

    支持的小组件

    小组件类型 数字小组件 IntSlider、FloatSlider、FloatLogSlider、IntRangeSlider、FloatRangeSlider、IntProgress、FloatProgress、BoundedIntText、BoundedFloatText、IntText、FloatText 布尔小组件 ToggleButton、Checkbox、Valid 选择小组件 Dropdown、RadioButtons、Select、SelectionSlider、SelectionRangeSlider、ToggleButtons、SelectMultiple 字符串小组件 Text、TextArea、Combobox、Password、Label、HTML、HTML Math、Image、Button 播放(动画)小组件 DatePicker、ColorPicker、Controller 容器/布局小组件 Box、HBox、VBox、GridBox、Accordion、Tabs、Stacked

    已知的限制

  • 尚不支持以下小组件,但你可以按照以下相应的解决方法进行操作:

    magic 命令

    可以在 Synapse 笔记本中使用熟悉的 Jupyter magic 命令。 查看以下列表了解当前可用的 magic 命令。 告诉我们你在 GitHub 上的用例,以便我们可以继续构建更多 magic 命令来满足你的需求。

    Synapse 管道仅支持以下 magic 命令:%%pyspark、%%spark、%%csharp 和 %%sql。

    可用行 magic:%lsmagic%time%timeit%history%run%load

    可用单元格 magic:%%time%%timeit%%capture%%writefile%%sql%%pyspark%%spark%%csharp%%html%%configure

    引用未发布的笔记本

    当你想要进行“本地”调试时,引用未发布的笔记本将非常有用。启用此功能后,笔记本运行将提取 Web 缓存中的当前内容。如果运行包含引用笔记本语句的单元格,你将引用当前笔记本浏览器中呈现的笔记本,而不是保存在群集中的版本,这意味着你在笔记本编辑器中所做的更改可立即被其他笔记本所引用,而无需发布(Live 模式)或提交(Git 模式)。通过利用此方法,可以轻松地避免开发或调试过程期间常用库受到污染。

    可以从“属性”面板中启用“引用未发布的笔记本”:

    对于不同的案例比较,请查看下表:

    请注意,%runmssparkutils.notebook.run 在这里具有相同的行为。 我们此处以 %run 为例。

    活动会话管理

    现在可以方便地重复使用笔记本会话,而无需启动新会话。 Synapse 笔记本现在支持在“管理会话”列表中管理活动会话,可以从笔记本看到你启动的当前工作区中的所有会话。

    在“活动会话”列表中,可以看到会话信息和当前附加到会话的相应笔记本。 可以在此处操作“与笔记本分离”、“停止会话”和“在监视中查看”。 此外,可以轻松地将所选笔记本连接到从另一个笔记本启动的列表中的活动会话,该会话将与前一个笔记本分离(如果非空闲),然后附加到当前笔记本。

    笔记本中的 Python 日志记录

    可以查找 Python 日志,并按照以下示例代码设置不同的日志级别和格式:

    import logging
    # Customize the logging format for all loggers
    FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    formatter = logging.Formatter(fmt=FORMAT)
    for handler in logging.getLogger().handlers:
        handler.setFormatter(formatter)
    # Customize log level for all loggers
    logging.getLogger().setLevel(logging.INFO)
    # Customize the log level for a specific logger
    customizedLogger = logging.getLogger('customized')
    customizedLogger.setLevel(logging.WARNING)
    # logger that use the default global log level
    defaultLogger = logging.getLogger('default')
    defaultLogger.debug("default debug message")
    defaultLogger.info("default info message")
    defaultLogger.warning("default warning message")
    defaultLogger.error("default error message")
    defaultLogger.critical("default critical message")
    # logger that use the customized log level
    customizedLogger.debug("customized debug message")
    customizedLogger.info("customized info message")
    customizedLogger.warning("customized warning message")
    customizedLogger.error("customized error message")
    customizedLogger.critical("customized critical message")
    

    集成笔记本

    将笔记本添加到管道

    选择右上角的“添加到管道”按钮,将笔记本添加到现有管道或创建新管道。

    指定参数单元格

    若要对笔记本进行参数化,选择省略号 (…) 以访问单元格工具栏上的“更多命令”。 然后选择“切换参数单元格”,将该单元格指定为参数单元格。

    Azure 数据工厂查找参数单元格,并将此单元格作为执行时传入的参数的默认单元格。 执行引擎将使用输入参数在参数单元格下面添加新的单元格,以覆盖默认值。

    从管道分配参数值

    使用参数创建笔记本后,可以从具有 Synapse 笔记本活动的管道执行该笔记本。 将活动添加到管道画布后,将能够在“设置”选项卡的“基本参数”部分设置参数值。

    分配参数值时,可以使用管道表达式语言系统变量

    与 Jupyter Notebooks 类似,Synapse 笔记本具有模式用户界面。 键盘根据笔记本单元格的具体模式执行不同的任务。 Synapse 笔记本支持给定代码单元格的以下两种模式:命令模式和编辑模式。

  • 当没有文本光标提示你键入时,单元格处于命令模式。 当单元格处于命令模式时,可以将笔记本作为一个整体进行编辑,但不能键入单独的单元格。 按 ESC 或使用鼠标选择单元格编辑器区域外部,进入命令模式。

  • 编辑模式由文本光标指示,提示你在编辑器区域中键入内容。 当单元格处于编辑模式时,可以在单元格中键入。 按 Enter 或使用鼠标选择单元格的编辑器区域,进入编辑模式。

    命令模式下的快捷键

    Synapse 笔记本快捷方式
  • 查看 Synapse 示例笔记本
  • 快速入门:使用 Web 工具在 Azure Synapse Analytics 中创建 Apache Spark 池
  • Azure Synapse Analytics 中的 Apache Spark 是什么
  • 将 .NET for Apache Spark 与 Azure Synapse Analytics 配合使用
  • .NET for Apache Spark 文档
  • Azure Synapse Analytics
  •