并行化如何使用JDBC
?
这是我的代码:
spark = SparkSession.builder.getOrCreate()
DF = spark.read.jdbc( url = ...,
table = '...',
column = 'XXXX',
lowerBound = Z,
upperBound = Y,
numPartitions = K
)
我想知道如何与以下参数相关,以及是否有正确选择它们的方法:
column
- >它应该是为分区选择的列lowerBound
- >是否有选择它的经验法则?upperBound
- >是否有选择它的经验法则?numPartitions
- >是否有选择它的经验法则?我理解
stride = ( upperBound / numPartitions ) - ( lowerBound / numPartitions )
有很多"步伐"在每个分区?
换句话说,在所有观察结束之前,分区是否填充了一堆步幅?
请看this picture 考虑到以下参数,了解问题:
lowerBound 80.000
upperBound 180.000
numPartitions 8
Stride 12.500
请注意:
min('XXXX') = 0
max('XXXX') = 350.000
('XXXX').count() = 500.000.000
P.S。我阅读了documentation和this的答案,但我对此并不了解。
答案 0 :(得分:1)
是的,根据文档,列需要是一个数字列。为什么?因为否则你无法计算 stride ,它是(upperBound - lowerBound)/ numPartitions = 12.500(每个分区的项目)
我认为如果列已经是数据库中的索引列,那将是理想的,因为您需要尽快检索这些记录。然后upperBound和lowerBound应该是要检索到spark的数据的边界(例如,考虑column = id,那么您需要的数据可能是id between 1 and max(id)
)。
正确的numPartitions是一个难以准确处理所有案例的主题。但要注意的一个经典问题是连接池的大小。您应该避免例如并行创建比池可以处理的更多连接。当然,并行连接的数量直接连接到分区的数量。例如,如果您有8个最大分区,则确保最大并行连接数也为8.有关如何为numPartitions选择正确值的更多信息,您可以检查this