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