如果我们设置了限制为100,并且Spark应用程序连接到具有百万条记录的数据库。那么Spark会加载所有百万条记录还是加载100乘100?
答案 0 :(得分:0)
Spark如何从数据库加载数据?它取决于数据库类型及其连接器实现。当然,对于分布式处理框架,分布式数据摄取始终是构建连接器的主要目的。
作为一个简单的示例,如果我们在一个表中有一条(1百万条)记录,并且当我们load()
时我们将分区数定义为100,那么理想情况下,读取任务将被分配给执行者,因此每个执行者读取一系列(10,000)条记录并将它们存储在内存中的相应分区中。参见SQL Databases using JDBC.
在Spark UI中,您可以看到numPartitions决定了启动的任务数。每个任务分散在执行程序中,这可以提高通过JDBC接口进行读写操作的并行性
Spark提供了灵活的接口(Spark DataSource V2),使我们能够构建自己的自定义数据源连接器。这里的主要设计重点是根据定义的分区数量并行化读取操作。另外,请检查(figure 4)以了解Spark中分布式CSV提取的工作原理。
更新
从跨多个工作程序的JDBC连接中读取
df = spark.read.jdbc(
url=jdbcUrl,
table="employees",
column="emp_no",
lowerBound=1,
upperBound=100000,
numPartitions=100
)
display(df)
在上述示例代码中,我们使用JDBC read将{read {1}},emp_no
,partitionColumn
和{{ {1}}。