【问题标题】:Spark JDBC UpperBoundSpark JDBC 上界
【发布时间】:2021-09-19 06:04:09
【问题描述】:
           jdbc(String url,
                     String table,
                     String columnName,
                     long lowerBound,
                     long upperBound,
                     int numPartitions,
                     java.util.Properties connectionProperties)

你好, 我想使用 spark jdbc 连接将几个表从 Oracle 导入 hdfs。为了确保并行性,我想为每个表选择正确的上限。我计划将 row_number 作为我的分区列,并将表的计数作为上限。有没有更好的方法来选择upperBound?,因为我必须在第一时间连接到表才能获得计数。请帮忙

【问题讨论】:

  • 这里的row_number 是什么?它是预先计算的吗?或者它会在oracle查询中?如果它在查询中,那么我认为它不会是高性能的。它将比 DB 产生巨大的开销。
  • spark sql 查询中的row_number

标签: apache-spark jdbc spark-jdbc


【解决方案1】:

通常是在 Spark JDBC 中使用分区的更好方法:

  • 选择数字或日期类型列。
  • 将上限设置为 col 的最大值
  • 将下限设置为 col 的最小值

(如果有歪斜的话还有其他办法处理,一般这样就好)

显然以上需要一些查询和处理

  • 保留表的映射:分区列(可能是外部存储)
  • 查询和获取最小值、最大值

另一个跳过查询的技巧:如果你能找到一个基于日期的列,你可以使用upper = today's date 和lower = 2000's date。但它再次受制于您的内容。这些值可能不成立。

根据您的问题,我相信您正在寻找可以轻松应用于所有表格的通用内容。我知道这是所需的状态,但它就像在 DB 中使用 row_number 一样直接,默认情况下 Spark 会这样做。

这些功能在技术上可能有效,但肯定会比上述步骤慢,而且会给您的数据库带来额外的负载。

【讨论】:

  • 将上限设置为 col 的最大值 - 为此,首先我需要通过 JDBC 连接到 DB 对吗?...这会导致速度缓慢
  • 是的,但无论如何你都必须操作row_number,这肯定比max(column)慢。
  • 但如果都是字符串,那么是的,除了依赖函数的值,你别无选择。
  • 所以如果我们必须使用 max (column),我们使用 spark.read.jdbc 连接到 DB 对吗?...那么我们是在做两次 spark.read.jdbc 吗?
  • 连接可能是两次。但看看复杂性。 1 small query + direction partition query VS single query which computes row_number first then derives partition qury 。您可以随时在大桌子上进行实际尝试并比较结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 2018-02-24
  • 2019-02-22
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多