我想使用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查询来获得结果。你建议用哪种方法?
1条答案
按热度按时间bvuwiixz1#
因此,使用上述方法使用单个jdbc连接将表拉入spark环境。如果您想在查询中使用push-down predicate ,那么可以这样使用。
如果要提高性能,就需要在读取时管理并行性。可以基于数据集的列值提供拆分边界。
这些选项指定读取时的并行性。如果指定了任何选项,则必须全部指定这些选项。lowerbound和upperbound决定分区步长,但不过滤表中的行。因此,spark将分区并返回表中的所有行。
下面的示例使用columnname、lowerbound、upperbound和numpartitions参数在emp\u no列上的执行器之间拆分读取的表。
有关详细信息,请使用此链接