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 从数据源动态获取最大值和最小值的主要内容,如果未能解决你的问题,请参考以下文章

如何获取集群的最小值和最大值

获取 RDD 中每个键的最大值和最小值

sql查询时间最小值的列

当 SQL 出现最小值或最大值时,如何获取时间戳?

SQL:在一列中获取最小值和最大值

从动态数据表中查找行中的最小值