Spark SQL 从数据源动态获取最大值和最小值
Posted
技术标签:
【中文标题】Spark SQL 从数据源动态获取最大值和最小值【英文标题】:Spark SQL get max & min dynamically from datasource 【发布时间】:2017-01-03 14:17:57 【问题描述】:我正在使用 Spark SQL,我想每天从 Oracle 表(包含超过 180 万条记录)中获取整个数据。当我从 Oracle 读取数据时,应用程序挂起,因此我使用了 partitionColumn、lowerBound 和 upperBound 的概念。但是,问题是如何动态获取主键列的 lowerBound & upperBound 值?每天下界和上界的值都会发生变化。因此如何动态获取主键列的边界值?任何人都可以为我的问题提供一个示例示例吗?
【问题讨论】:
你不一定需要这个。下限和上限用于在执行程序之间进行分区(请参阅spark.apache.org/docs/latest/…)。这意味着即使他们错了,除了执行者之间的一些偏差之外,什么也没有发生。除非变化真的很大,在某些情况下会导致很大的偏差,否则你可能会放弃给出近似值。顺便说一句,即使有超出限制的值,它们仍然会转到某个执行器(即不要担心异常值) 【参考方案1】:只需从数据库中获取所需的值:
url = ...
properties = ...
partition_column = ...
table = ...
# Push aggregation to the database
query = "(SELECT min(0), max(0) FROM 1) AS tmp".format(
partition_column, table
)
(lower_bound, upper_bound) = (spark.read
.jdbc(url=url, table=query. properties=properties)
.first())
并传递给主查询:
num_partitions = ...
spark.read.jdbc(
url, table,
column=partition_column,
# Make upper bound inclusive
lowerBound=lower_bound, upperBound=upper_bound + 1,
numPartitions=num_partitions, properties=properties
)
【讨论】:
以上是关于Spark SQL 从数据源动态获取最大值和最小值的主要内容,如果未能解决你的问题,请参考以下文章