Python 3.x 通过JDBC进行并行化-Pyspark-使用JDBC进行并行化是如何工作的?
使用JDBC的并行化是如何工作的 这是我的密码:Python 3.x 通过JDBC进行并行化-Pyspark-使用JDBC进行并行化是如何工作的?,python-3.x,apache-spark,jdbc,parallel-processing,pyspark,Python 3.x,Apache Spark,Jdbc,Parallel Processing,Pyspark,使用JDBC的并行化是如何工作的 这是我的密码: spark = SparkSession.builder.getOrCreate() DF = spark.read.jdbc( url = ..., table = '...', column = 'XXXX', lowerBound
spark = SparkSession.builder.getOrCreate()
DF = spark.read.jdbc( url = ...,
table = '...',
column = 'XXXX',
lowerBound = Z,
upperBound = Y,
numPartitions = K
)
我想知道以下参数之间的关系,以及是否有办法正确选择它们:
列
->它应该是为分区选择的列(它需要是数字列吗?)
lowerBound
->有经验法则来选择它吗上限
->有经验法则来选择它吗numPartitions
->有经验法则来选择它吗stride = ( upperBound / numPartitions ) - ( lowerBound / numPartitions )
每个分区中是否有许多“跨步”
换句话说,在完成所有观察之前,分区是否都充满了一系列的步幅
请看
要了解问题的含义,请考虑以下参数:
lowerBound 80.000
upperBound 180.000
numPartitions 8
Stride 12.500
请注意:
min('XXXX') = 0
max('XXXX') = 350.000
('XXXX').count() = 500.000.000
另外,我读了答案和答案,但我不太明白
祝你好运嗨,Alexandros,谢谢你提供的答案!查看第2点,您说过“[…]上限和下限应该是要检索到spark[…]中的数据的边界”。那么,如果我将
id设置在1和max(id)/2之间,我会有一个.count()
即整个DB的1/2,这是正确的吗?非常感谢!这取决于您的ID@Franco的分布情况。如果每次插入时id增加1,则“是”是安全的,尽管许多数据库不确保在下一次插入期间id将等于new_id=max(id)+1,因为它们希望避免这种额外的开销。所以我想说你需要检查一下。例如,您可以检查max(id)-min(id)~count(*)是否完全相同,然后是可以安全地进行假设。如果距离足够近,您可以根据需要的精度自行决定。因此,考虑以下情况:min('XXXX')=0
max('XXXX')=350.000
('XXXX')。count()=500.000.000
您会根据该值选择下限和上限吗(0 ~ 350.000)或者基于我有500.000.000个索引这一事实?在这种情况下你不能做这个假设。让我们再举一个例子,假设你有表公司。这个表有一个名为id的PK,那么如果你在这个表上有100.000条记录,id必须至少是100.000。所以在你发给我的例子中,做这个假设没有意义选项。换句话说,在您最后的评论中,count和列之间没有线性关系。如果可能,所使用的列必须是键,否则您必须重新考虑在my DB中使用numpartition我没有键(索引)列。我只有3个数字列。考虑到以下情况,您将如何继续并行化操作min('XXXX')=0
max('XXXX')=350.000
('XXXX')。count()=500.000.000?