Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 通过JDBC进行并行化-Pyspark-使用JDBC进行并行化是如何工作的?_Python 3.x_Apache Spark_Jdbc_Parallel Processing_Pyspark - Fatal编程技术网

Python 3.x 通过JDBC进行并行化-Pyspark-使用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

使用JDBC的并行化是如何工作的

这是我的密码:

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
    
    另外,我读了答案和答案,但我不太明白

  • 是,根据文档,it列需要是数字列。为什么?因为否则您无法计算步幅(上限-下限)/numPartitions=12.500(每个分区的项目数)

  • 我认为,如果列已经是数据库中的索引列,这将是理想的,因为您需要尽可能快地检索这些记录。然后,上界和下界应该是检索到火花的数据的边界(例如,考虑列=ID),那么您需要的数据可以是“代码> ID,在1和max(ID)之间)。

  • 在所有情况下,正确的分配是一个很难精确处理的话题。不过,需要注意的一个经典问题是连接池的大小。例如,您应该避免创建超出池处理能力的并行连接。当然,并行连接的数量与分区的数量直接相关。例如,如果您最多有8个分区,那么您可以确保并行连接的最大数量也是8。有关如何为numPartitions选择正确值的详细信息,请查看


  • 祝你好运

    嗨,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?