Apache spark Pyspark JDBC中的谓词不执行分区读取

Apache spark Pyspark JDBC中的谓词不执行分区读取,apache-spark,jdbc,pyspark,apache-spark-sql,partition,Apache Spark,Jdbc,Pyspark,Apache Spark Sql,Partition,我正在尝试使用JDBCRead在PySpark中读取Mysql表。这里比较棘手的一点是,表相当大,因此当我们的Spark执行器对表进行非分区普通读取时,它会导致崩溃 因此,目标函数基本上是我们想要对表进行分区读取。我们一直在尝试的两件事- 我们查看了“numPartitions partitionColumn lowerBound upperBound”组合。这对我们不起作用,因为原始表的索引键是一个字符串,这只适用于整型 文档中建议的另一种选择是谓词选项。这似乎对我们不起作用,因为分区的数量似

我正在尝试使用JDBCRead在PySpark中读取Mysql表。这里比较棘手的一点是,表相当大,因此当我们的Spark执行器对表进行非分区普通读取时,它会导致崩溃

因此,目标函数基本上是我们想要对表进行分区读取。我们一直在尝试的两件事-

  • 我们查看了“numPartitions partitionColumn lowerBound upperBound”组合。这对我们不起作用,因为原始表的索引键是一个字符串,这只适用于整型
  • 文档中建议的另一种选择是谓词选项。这似乎对我们不起作用,因为分区的数量似乎仍然是1,而不是我们发送的谓词的数量
  • 我们正在使用的代码片段如下-

    input_df = self._Flow__spark.read \
                .format("jdbc") \
                .option("url", url) \
                .option("user", config.user) \
                .option("password", config.password) \
                .option("driver", "com.mysql.cj.jdbc.Driver") \
                .option("dbtable", "({}) as query ".format(get_route_surge_details_query(start_date, end_date))) \
                .option("predicates", ["recommendation_date = '2020-11-14'",
                                       "recommendation_date = '2020-11-15'",
                                       "recommendation_date = '2020-11-16'",
                                       "recommendation_date = '2020-11-17'",
                                       ]) \
                .load()
    
    它似乎在进行完整的表扫描(非分区),同时完全忽略传递的谓词。如果能在这方面得到一些帮助,那就太好了。

    请尝试以下方法:

    spark\u会话\
    .读\
    .jdbc(url=url,
    table=“({})as query.”格式(获取路线、涌浪、详细信息、查询(开始日期、结束日期)),
    谓词=[“建议日期='2020-11-14'”,
    “建议日期='2020-11-15'”,
    “建议日期='2020-11-16'”,
    “建议日期='2020-11-17'”,
    性质={
    “用户”:config.user,
    “密码”:config.password,
    “驱动程序”:“com.mysql.cj.jdbc.driver”
    }
    )
    
    通过以下方式验证分区:

    df.rdd.getNumPartitions()#应为4
    

    我在

    挖掘文档后发现了这一点,我认为谓词不可能是一个选项。您必须改用jdbc函数。