问题描述
jdbc(String url,String table,String columnName,long lowerBound,long upperBound,int numPartitions,java.util.Properties connectionProperties)
你好, 我想使用 spark jdbc 连接将几个表从 Oracle 导入到 hdfs。为了确保并行性,我想为每个表选择正确的 upperBound。我计划将 row_number 作为我的分区列,并将表的计数作为 upperBound。有没有更好的方法来选择upperBound?,因为我必须在第一次连接到表才能得到计数。请帮忙
解决方法
通常在 Spark JDBC 中使用分区的更好方法:
- 选择数字或日期类型的列。
- 设置上限为col的最大值
- 设置下限为col的最小值
(如果有偏斜,还有其他处理方法,一般这样就好)
显然上面需要一些查询和处理
- 保持表的映射:分区列(可能是外部存储)
- 查询和获取最小值、最大值
另一个跳过查询的技巧:如果你能找到一个基于日期的列,你可能可以使用 upper = today's date
和lower = 2000's date
。但它又取决于您的内容。这些值可能不成立。
根据您的问题,我相信您正在寻找可以轻松应用于所有表格的通用内容。我知道这是所需的状态,但它与在 DB 中使用 row_number
一样直接,Spark 默认情况下已经这样做了。
这些功能在技术上可能有效,但肯定会比上述步骤慢,并且会给您的数据库带来额外的负载。