sql查询在azuredatabricks中花费的时间太长

dnph8jn4  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(522)

我想使用azuredatabricks在azuresql托管示例中的db上执行sql查询。我已连接到数据库使用Spark连接器。

import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

val config = Config(Map(
  "url"          -> "mysqlserver.database.windows.net",
  "databaseName" -> "MyDatabase",
  "queryCustom"  -> "SELECT TOP 100 * FROM dbo.Clients WHERE PostalCode = 98074" //Sql query
  "user"         -> "username",
  "password"     -> "*********",
))

//Read all data in table dbo.Clients
val collection = sqlContext.read.sqlDB(config)
collection.show()

我使用上面的方法来获取数据(示例来自msft doc)。我的table尺寸超过10米。我的问题是databricks如何处理这里的查询?
下面是文档:spark主节点连接到sql数据库或sql server中的数据库,并从特定表或使用特定sql查询加载数据。spark主节点将数据分发给工作节点进行转换。工作节点连接到连接到sql数据库和sql server的数据库,并将数据写入数据库。用户可以选择使用逐行插入或批量插入。
它表示主节点获取数据,然后将工作分发给工作节点。在上面的代码中,当获取数据时,如果查询本身很复杂并且需要时间怎么办?它是否将工作分散到工作节点?或者,我必须先获取表数据,然后运行sql查询来获得结果。你建议用哪种方法?

bvuwiixz

bvuwiixz1#

因此,使用上述方法使用单个jdbc连接将表拉入spark环境。如果您想在查询中使用push-down predicate ,那么可以这样使用。

val pushdown_query = "(select * from employees where emp_no < 10008) emp_alias"
val df = spark.read.jdbc(url=jdbcUrl, table=pushdown_query, 
properties=connectionProperties)
display(df)

如果要提高性能,就需要在读取时管理并行性。可以基于数据集的列值提供拆分边界。
这些选项指定读取时的并行性。如果指定了任何选项,则必须全部指定这些选项。lowerbound和upperbound决定分区步长,但不过滤表中的行。因此,spark将分区并返回表中的所有行。
下面的示例使用columnname、lowerbound、upperbound和numpartitions参数在emp\u no列上的执行器之间拆分读取的表。

val df = (spark.read.jdbc(url=jdbcUrl,
    table="employees",
    columnName="emp_no",
    lowerBound=1L,
    upperBound=100000L,
    numPartitions=100,
    connectionProperties=connectionProperties))
display(df)

有关详细信息,请使用此链接

相关问题