在Azure突触分析查询数据

您可以访问Azure从砖使用Azure突触的突触连接器,它使用复制声明在Azure突触砖之间有效地传输大量数据集群和Azure突触实例使用Azure数据存储Gen2存储湖占临时登台。

Azure突触分析是一个基于云计算的企业数据仓库,利用大规模并行处理(MPP)快速运行复杂的查询在pb的数据。

重要的

这个连接器使用突触专用池实例,并与其他突触不兼容组件。

请注意

复制只有在Azure湖代实例存储的数据。如果你正在寻找细节处理混合基时,看到的连接数据砖和Azure突触与混合基(遗留)

例如语法突触

您可以查询突触在Scala中,Python, SQL和r .下面的代码示例使用存储账户键和转发存储凭证从砖到突触。

请注意

使用Azure门户提供的连接字符串,使安全套接字层(SSL)加密所有数据发送火花司机和Azure突触之间通过JDBC连接实例。启用了SSL加密验证,你可以搜索加密= true在连接字符串。

/ /设置存储帐户访问关键会话配置在笔记本上。火花相依(“fs.azure.account.key < your-storage-account-name > .dfs.core.windows.net”。,“< your-storage-account-access-key >”)/ /从Azure突触表得到一些数据。瓦尔df:DataFrame=火花格式(“com.databricks.spark.sqldw”)选项(“url”," jdbc::状态"置疑" / / < the-rest-of-the-connection-string >”)选项(“tempDir”,“abfss: / / < your-container-name > @ < your-storage-account-name >.dfs.core.windows.net/ < your-directory-name >”)选项(“forwardSparkAzureStorageCredentials”,“真正的”)选项(“数据表”,“< your-table-name >”)负载()/ /加载数据从Azure突触查询。瓦尔df:DataFrame=火花格式(“com.databricks.spark.sqldw”)选项(“url”," jdbc::状态"置疑" / / < the-rest-of-the-connection-string >”)选项(“tempDir”,“abfss: / / < your-container-name > @ < your-storage-account-name >.dfs.core.windows.net/ < your-directory-name >”)选项(“forwardSparkAzureStorageCredentials”,“真正的”)选项(“查询”,“选择x, count(*)从表group by x”问)负载()/ /应用一些转换数据,然后使用/ /数据源API来编写数据返回到另一个表在Azure突触。df格式(“com.databricks.spark.sqldw”)选项(“url”," jdbc::状态"置疑" / / < the-rest-of-the-connection-string >”)选项(“forwardSparkAzureStorageCredentials”,“真正的”)选项(“数据表”,“< your-table-name >”)选项(“tempDir”,“abfss: / / < your-container-name > @ < your-storage-account-name >.dfs.core.windows.net/ < your-directory-name >”)保存()
#设置存储帐户访问关键会话配置在笔记本上。火花相依(“fs.azure.account.key < your-storage-account-name > .dfs.core.windows.net”。,“< your-storage-account-access-key >”)#从Azure突触表得到一些数据。df=火花\格式(“com.databricks.spark.sqldw”)\选项(“url”," jdbc::状态"置疑" / / < the-rest-of-the-connection-string >”)\选项(“tempDir”,“abfss: / / < your-container-name > @ < your-storage-account-name >.dfs.core.windows.net/ < your-directory-name >”)\选项(“forwardSparkAzureStorageCredentials”,“真正的”)\选项(“数据表”,“< your-table-name >”)\负载()#加载数据从Azure突触查询。df=火花\格式(“com.databricks.spark.sqldw”)\选项(“url”," jdbc::状态"置疑" / / < the-rest-of-the-connection-string >”)\选项(“tempDir”,“abfss: / / < your-container-name > @ < your-storage-account-name >.dfs.core.windows.net/ < your-directory-name >”)\选项(“forwardSparkAzureStorageCredentials”,“真正的”)\选项(“查询”,“选择x, count(*)从表group by x”问)\负载()#应用一些转换数据,然后使用#数据源API来编写数据返回到另一个表在Azure突触。df\格式(“com.databricks.spark.sqldw”)\选项(“url”," jdbc::状态"置疑" / / < the-rest-of-the-connection-string >”)\选项(“forwardSparkAzureStorageCredentials”,“真正的”)\选项(“数据表”,“< your-table-name >”)\选项(“tempDir”,“abfss: / / < your-container-name > @ < your-storage-account-name >.dfs.core.windows.net/ < your-directory-name >”)\保存()
——设置存储帐户访问关键会话配置在笔记本上。fsazure账户关键<你的- - - - - -存储- - - - - -账户- - - - - -的名字>dfs核心窗户= <你的- - - - - -存储- - - - - -账户- - - - - -访问- - - - - -关键>;——使用SQL读取数据。创建example_table_in_spark_read使用com火花sqldw选项(url“jdbc::状态"置疑" / / < the-rest-of-the-connection-string >”,forwardSparkAzureStorageCredentials“真正的”,数据表“< your-table-name >”,tempDir“abfss: / / < your-container-name > @ < your-storage-account-name >.dfs.core.windows.net/ < your-directory-name >”);——写入数据使用SQL。——创建一个新表,抛出错误如果具有相同名称的表已经存在:创建example_table_in_spark_write使用com火花sqldw选项(url“jdbc::状态"置疑" / / < the-rest-of-the-connection-string >”,forwardSparkAzureStorageCredentials“真正的”,数据表“< your-table-name >”,tempDir“abfss: / / < your-container-name > @ < your-storage-account-name >.dfs.core.windows.net/ < your-directory-name >”)作为选择*table_to_save_in_spark;
#负载SparkR图书馆(SparkR)#设置存储帐户访问关键会话配置在笔记本上。相依< -sparkR.callJMethod(sparkR.session(),“配置”)sparkR.callJMethod(相依,“设置”,“fs.azure.account.key < your-storage-account-name > .dfs.core.windows.net”。,“< your-storage-account-access-key >”)#从Azure突触表得到一些数据。df< -read.df(=“com.databricks.spark.sqldw”,url=" jdbc::状态"置疑" / / < the-rest-of-the-connection-string >”,forward_spark_azure_storage_credentials=“真正的”,数据表=“< your-table-name >”,tempDir=“abfss: / / < your-container-name > @ < your-storage-account-name >.dfs.core.windows.net/ < your-directory-name >”)#加载数据从Azure突触查询。df< -read.df(=“com.databricks.spark.sqldw”,url=" jdbc::状态"置疑" / / < the-rest-of-the-connection-string >”,forward_spark_azure_storage_credentials=“真正的”,查询=“选择x, count(*)从表group by x”问,tempDir=“abfss: / / < your-container-name > @ < your-storage-account-name >.dfs.core.windows.net/ < your-directory-name >”)#应用一些转换数据,然后使用#数据源API来编写数据返回到另一个表在Azure突触。write.df(df,=“com.databricks.spark.sqldw”,url=" jdbc::状态"置疑" / / < the-rest-of-the-connection-string >”,forward_spark_azure_storage_credentials=“真正的”,数据表=“< your-table-name >”,tempDir=“abfss: / / < your-container-name > @ < your-storage-account-name >.dfs.core.windows.net/ < your-directory-name >”)

身份验证数据砖和突触之间是如何工作的呢?

Azure突触连接器使用三种类型的网络连接:

  • 引发司机Azure突触

  • 火花集群Azure存储账户

  • Azure突触Azure存储账户

配置访问Azure存储

砖和突触需要获取一个Azure存储的特权帐户用于临时数据存储。

Azure突触不支持使用SAS存储帐户访问。您可以配置为服务的访问通过下列之一:

Azure突触需要权限

因为它使用复制在后台,Azure突触连接器需要JDBC连接用户有权限在Azure突触连接实例中运行以下命令:

如果目标表不存在在Azure突触,许可需要运行以下命令除了上面的命令:

下表总结了写所需的权限复制:

权限(插入到现有表)

权限(插入一个新表)

管理数据库批量操作

插入

管理数据库批量操作

插入

创建表

改变模式::dbo

网络配置

如果您配置防火墙在Azure突触,您必须配置网络设置允许砖到Azure的突触。首先,确保你的砖工作区部署在自己的虚拟网络_。你可以上配置IP防火墙规则Azure Synpase允许从你的子网连接你的Synpase账户。看到Azure突触分析IP防火墙规则

配置连接从砖到突触OAuth 2.0服务主体

你可以验证Azure突触分析使用一个服务主体与访问底层存储账户。使用的更多信息服务主体的凭证访问一个Azure存储账户,明白了连接到数据存储Gen2湖和Blob存储Azure。你必须设置enableServicePrincipalAuth选项真正的在连接配置砖突触连接器的选择参考使连接器与一个服务主体进行身份验证。

您可以选择使用不同的服务主体的Azure突触连接的分析。下面的示例配置服务主体的凭证存储账户和突触的可选服务主体的凭证:

;定义服务主体的凭证Azure存储账户fs.azure.account.auth。OAuth类型fs.azure.account.oauth.provider。类型org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProviderfs.azure.account.oauth2.client。id <应用程序id >fs.azure.account.oauth2.client。秘密< service-credential >fs.azure.account.oauth2.client。端点https://login.microsoftonline.com/ < directory-id > / oauth2 /令牌;定义一个单独的服务主体的凭证Azure突触分析(如果没有定义,连接器将使用Azure存储帐户凭据)spark.databricks.sqldw.jdbc.service.principal.client。id <应用程序id >spark.databricks.sqldw.jdbc.service.principal.client。秘密< service-credential >
/ /定义服务主体的凭证Azure存储账户火花相依(“fs.azure.account.auth.type”,“OAuth”)火花相依(“fs.azure.account.oauth.provider.type”,“org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider”)火花相依(“fs.azure.account.oauth2.client.id”,“<应用程序id >”)火花相依(“fs.azure.account.oauth2.client.secret”,“< service-credential >”)火花相依(“fs.azure.account.oauth2.client.endpoint”,“https://login.microsoftonline.com/ < directory-id > / oauth2 /令牌”)/ /定义一个单独的服务主体的凭证Azure突触分析(如果没有定义,连接器将使用Azure存储帐户凭据)火花相依(“spark.databricks.sqldw.jdbc.service.principal.client.id”,“<应用程序id >”)火花相依(“spark.databricks.sqldw.jdbc.service.principal.client.secret”,“< service-credential >”)
#定义服务主体的凭证Azure存储账户火花相依(“fs.azure.account.auth.type”,“OAuth”)火花相依(“fs.azure.account.oauth.provider.type”,“org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider”)火花相依(“fs.azure.account.oauth2.client.id”,“<应用程序id >”)火花相依(“fs.azure.account.oauth2.client.secret”,“< service-credential >”)火花相依(“fs.azure.account.oauth2.client.endpoint”,“https://login.microsoftonline.com/ < directory-id > / oauth2 /令牌”)#定义一套独立的服务主体的凭证Azure突触分析(如果没有定义,连接器将使用Azure存储帐户凭据)火花相依(“spark.databricks.sqldw.jdbc.service.principal.client.id”,“<应用程序id >”)火花相依(“spark.databricks.sqldw.jdbc.service.principal.client.secret”,“< service-credential >”)
#负载SparkR图书馆(SparkR)相依< -sparkR.callJMethod(sparkR.session(),“配置”)#定义服务主体的凭证Azure存储账户sparkR.callJMethod(相依,“设置”,“fs.azure.account.auth.type”,“OAuth”)sparkR.callJMethod(相依,“设置”,“fs.azure.account.oauth.provider.type”,“org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider”)sparkR.callJMethod(相依,“设置”,“fs.azure.account.oauth2.client.id”,“<应用程序id >”)sparkR.callJMethod(相依,“设置”,“fs.azure.account.oauth2.client.secret”,“< service-credential >”)sparkR.callJMethod(相依,“设置”,“fs.azure.account.oauth2.client.endpoint”,“https://login.microsoftonline.com/ < directory-id > / oauth2 /令牌”)#定义一套独立的服务主体的凭证Azure突触分析(如果没有定义,连接器将使用Azure存储帐户凭据)sparkR.callJMethod(相依,“设置”,“spark.databricks.sqldw.jdbc.service.principal.client.id”,“<应用程序id >”)sparkR.callJMethod(相依,“设置”,“spark.databricks.sqldw.jdbc.service.principal.client.secret”,“< service-credential >”)

支持保存模式批写道

Azure突触连接器支持ErrorIfExists,忽略,附加,覆盖默认模式是保存模式ErrorIfExists。有关支持的更多信息模式保存在Apache火花,明白了火花SQL文档保存模式

砖突触连接器的选择参考

选项提供火花SQL支持以下设置:

参数

要求

默认的

笔记

数据表

是的,除非查询指定

没有默认的

表创建或从Azure突触。这个参数时需要保存数据回Azure突触。

您还可以使用{模式名称},{表名称}访问一个表在一个给定的模式。如果不提供模式名称,默认模式与用户使用JDBC。

以前的支持数据表变异是弃用,将在未来的版本中被忽略。使用“驼峰式大小写”的名字。

查询

是的,除非数据表指定

没有默认的

查询阅读从Azure突触。

表查询中引用,您还可以使用{模式名称},{表名称}访问一个表在一个给定的模式。如果不提供模式名称,默认模式与用户使用JDBC。

用户

没有

没有默认的

Azure的突触用户名。必须配合使用密码选择。只能使用,如果用户名和密码并不是通过在URL中。通过将导致一个错误。

密码

没有

没有默认的

Azure突触密码。必须配合使用用户选择。只能使用,如果用户名和密码并不是通过在URL中。通过将导致一个错误。

url

是的

没有默认的

一个JDBC URLsqlserver设置为subprotocol。推荐使用Azure门户提供的连接字符串。设置加密= true是强烈推荐的,因为它使SSL加密的JDBC连接。如果用户密码分别设置,您不需要包含URL。

jdbcDriver

没有

由JDBC URL的subprotocol决定

要使用JDBC驱动程序的类名。这个类必须在类路径中。在大多数情况下,它应该不需要指定这个选项,当适当的驱动程序类名应该自动由JDBC URL的subprotocol。

以前的支持jdbc_driver变异是弃用,将在未来的版本中被忽略。使用“驼峰式大小写”的名字。

tempDir

是的

没有默认的

一个abfssURI。我们建议你使用一个专用的Blob存储Azure突触的容器。

以前的支持tempdir变异是弃用,将在未来的版本中被忽略。使用“驼峰式大小写”的名字。

tempCompression

没有

时髦的

要使用的压缩算法编码/解码临时火花和Azure突触。目前支持的值是:未压缩的,时髦的GZIP

forwardSparkAzureStorageCredentials

没有

如果真正的,图书馆自动发现火花的凭证是用来连接到Blob存储容器和将这些凭证转发到Azure突触在JDBC。这些凭据发送JDBC查询的一部分。因此强烈建议您启用SSL加密的JDBC连接时使用此选项。

配置存储身份验证时,您必须设置一个useAzureMSIforwardSparkAzureStorageCredentials真正的。此外,您可以设置enableServicePrincipalAuth真正的和使用JDBC和存储身份验证服务原则。

以前的支持forward_spark_azure_storage_credentials变异是弃用,将在未来的版本中被忽略。使用“驼峰式大小写”的名字。

useAzureMSI

没有

如果真正的,图书馆将指定身份=的管理服务身份的也没有秘密它创建数据库的作用域凭据。

配置存储身份验证时,您必须设置一个useAzureMSIforwardSparkAzureStorageCredentials真正的。此外,您可以设置enableServicePrincipalAuth真正的和使用JDBC和存储身份验证服务原则。

enableServicePrincipalAuth

没有

如果真正的,图书馆将使用提供的服务主体的凭证连接到Azure存储账户和Azure突触分析/ JDBC。

如果任何一forward_spark_azure_storage_credentialsuseAzureMSI被设置为真正的,选择将优先于在存储身份验证服务原则。

tableOptions

没有

集群COLUMNSTORE指数,分布=ROUND_ROBIN

用于指定字符串表选项当创建Azure突触的餐桌上数据表。这个字符串传递的条款的创建对Azure突触发出的SQL语句。

以前的支持table_options变异是弃用,将在未来的版本中被忽略。使用“驼峰式大小写”的名字。

预作用

没有

没有默认的(空字符串)

一个;分离的执行SQL命令列表Azure突触前写数据到Azure突触实例。这些SQL命令必须是有效的命令接受Azure突触。

如果这些命令失败,它被视为一个错误和不执行写操作。

postActions

没有

没有默认的(空字符串)

一个;分离的执行SQL命令列表Azure突触后连接器成功写数据到Azure突触实例。这些SQL命令必须是有效的命令接受Azure突触。

如果这些命令失败,它被视为一个错误后,你会得到一个异常数据成功地写入到Azure突触实例。

maxStrLength

没有

256年

StringType在火花是映射到NVARCHAR (maxStrLength)在Azure突触类型。您可以使用maxStrLength设置字符串长度NVARCHAR (maxStrLength)类型列在表的名字数据表在Azure突触。

以前的支持maxstrlength变异是弃用,将在未来的版本中被忽略。使用“驼峰式大小写”的名字。

applicationName

没有

Databricks-User-Query

连接的标签为每个查询。如果未指定或值是空字符串,默认值的标签添加JDBC URL。默认值可以防止Azure数据库监控工具提高寄生对查询的SQL注入警报。

maxbinlength

没有

没有默认的

控制列的长度BinaryType列。这个参数是翻译成VARBINARY (maxbinlength)

identityInsert

没有

设置为真正的使IDENTITY_INSERT模式,插入一个DataFrame提供价值的标识列Azure突触表。

看到显式值插入一个标识列

externalDataSource

没有

没有默认的

一个预定义的外部数据源读取数据从Azure突触。外部数据源只能使用混合基和消除了控制许可要求因为连接器不需要创建一个作用域凭据和外部数据源加载数据。

例如使用和所需的权限列表使用外部数据源时,看到的需要Azure突触权限混合基与外部数据源的选择

maxErrors

没有

0

的最大行数可以在装运之前拒绝了在读写操作取消。拒绝行将被忽略。例如,如果两个的记录有错误,只有8条记录会被处理。

看到REJECT_VALUE文档创建外部表MAXERRORS文档中复制

inferTimestampNTZType

没有

如果真正的,值类型的Azure突触时间戳被解读为TimestampNTZType在读取(时间戳没有时区)。否则,所有的时间戳都解释为TimestampType无论在底层Azure突触类型表。

请注意

  • tableOptions,预作用,postActions,maxStrLength只有当写作相关数据从砖在Azure突触一个新表。

  • 即使所有数据源选择名称不区分大小写的,我们建议您指定在“驼峰式大小写”清晰。

查询下推到Azure突触

Azure突触连接器实现了一组优化规则,推动以下运营商分成Azure突触:

  • 过滤器

  • 项目

  • 限制

项目过滤器运营商支持以下表达式:

  • 大多数布尔逻辑运算符

  • 比较

  • 基本的算术运算

  • 数字和字符串类型转换

限制支持运营商叠加只有当没有指定命令。例如:

选择(10)*,但不选择(10)*订单通过上校

请注意

Azure突触连接器不压低表达式操作字符串,日期或时间戳。

查询下推了Azure突触连接器是默认启用。你可以通过设置禁用它spark.databricks.sqldw.pushdown

临时数据管理

Azure突触连接器删除临时文件,它会创建在Azure存储容器。砖建议您定期删除临时文件根据用户提供的tempDir的位置。

为了便于数据清理,Azure突触连接器并不直接存储数据文件tempDir,而是创建了一个目录的形式:< tempDir > / < yyyy-MM-dd > / < HH-mm-ss-SSS > / < randomUUID > /。您可以设置(使用砖周期性工作工作特性或其他)递归删除超过给定阈值的任何子目录(例如,2天),假设不可能有火花工作运行超过这个门槛。

一个简单的替代方法是定期删除整个容器,并使用相同的名称创建一个新的。这要求您使用专用容器Azure突触连接器产生的临时数据,你可以找到一个时间窗口,你可以保证没有涉及连接器正在运行的查询。

临时对象管理

Azure突触连接器自动化数据传输数据砖集群和Azure突触之间的实例。从Azure突触读取数据表或查询或写数据到Azure突触表,Azure突触连接器创建临时对象,包括数据库作用域凭证,外部数据,外部文件格式,外部在幕后。这些对象只在相应的火花的时间工作,会自动下降。

当集群是运行一个查询使用Azure突触连接器,如果火花司机进程崩溃或强行重新启动,或如果强行终止或重新启动集群,临时对象可能不会下降。为了便于识别和手动删除这些对象,Azure突触连接器前缀的名字中间Azure突触实例中创建临时对象的标记形式:tmp_databricks_ < yyyy_MM_dd_HH_mm_ss_SSS > _ < randomUUID > _ < internalObject >

我们建议您定期使用查询寻找泄漏对象如以下:

  • 选择*sys.database_scoped_credentials在哪里的名字就像“tmp_databricks_ %”

  • 选择*sys.external_data_sources在哪里的名字就像“tmp_databricks_ %”

  • 选择*sys.external_file_formats在哪里的名字就像“tmp_databricks_ %”

  • 选择*sys.external_tables在哪里的名字就像“tmp_databricks_ %”