通过JDBC进行并行化 - Pyspark - 并行化如何使用JDBC工作?

时间:2018-03-13 09:46:51

标签: python-3.x apache-spark jdbc parallel-processing pyspark

并行化如何使用JDBC

这是我的代码:

spark = SparkSession.builder.getOrCreate()
DF    = spark.read.jdbc( url           =  ...,
                         table         = '...',
                         column        = 'XXXX',
                         lowerBound    =  Z,
                         upperBound    =  Y,
                         numPartitions = K
                         )

我想知道如何与以下参数相关,以及是否有正确选择它们的方法:

  1. column - >它应该是为分区选择的列
    (它是否需要是一个数字列?)
  2. lowerBound - >是否有选择它的经验法则?
  3. upperBound - >是否有选择它的经验法则?
  4. numPartitions - >是否有选择它的经验法则?
  5. 我理解

    stride = ( upperBound / numPartitions ) - ( lowerBound / numPartitions )
    

    有很多"步伐"在每个分区?

    换句话说,在所有观察结束之前,分区是否填充了一堆步幅?

    请看this picture 考虑到以下参数,enter image description here了解问题:

     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。我阅读了documentationthis的答案,但我对此并不了解。

1 个答案:

答案 0 :(得分:1)

  1. 是的,根据文档,需要是一个数字列。为什么?因为否则你无法计算 stride ,它是(upperBound - lowerBound)/ numPartitions = 12.500(每个分区的项目)

  2. 我认为如果列已经是数据库中的索引列,那将是理想的,因为您需要尽快检索这些记录。然后upperBound和lowerBound应该是要检索到spark的数据的边界(例如,考虑column = id,那么您需要的数据可能是id between 1 and max(id))。

  3. 正确的numPartitions是一个难以准确处理所有案例的主题。但要注意的一个经典问题是连接池的大小。您应该避免例如并行创建比池可以处理的更多连接。当然,并行连接的数量直接连接到分区的数量。例如,如果您有8个最大分区,则确保最大并行连接数也为8.有关如何为numPartitions选择正确值的更多信息,您可以检查this

  4. 祝你好运