使用Spark-JDBC时是否可以在partitionColumns中提供多个列?

时间:2018-10-05 12:04:07

标签: apache-spark

我正在尝试读取postgres db上的表,并将数据加载到HDFS上的Hive表中,如下所示:

val yearDF = spark.read.format("jdbc").option("url", connectionUrl).option("dbtable", s"(${execQuery}) as year2017")
.option("user", devUserName).option("password", devPassword)
.option("partitionColumn","source_system_name")
.option("lowerBound", 10000).option("upperBound", 50000)
.option("numPartitions",12).load()

我的工作失败,并显示以下消息:容器退出,退出代码为非零143&GC开销问题。

数据巨大,导致分区偏斜。 观察表中的数据后,我了解到“ source_system_name”不是用于对数据进行分区的正确列。但是我发现这是其他三列的组合:source_system_name, org_code, period最适合在读取和处理时拆分数据。 (我做了一个“分组依据”来找出表中的行数,并且数据在每个分组中平均分布) 但是我不知道如何在spark-jdbc的partitionColumn选项中使用所有三列。任何人都可以让我知道是否可以在选项中使用多个列:partitionColumn,同时从RDBMS表读取数据。

1 个答案:

答案 0 :(得分:1)

不,以下情况适用:

  • 对于partitionColumn,lowerBound,upperBound-如果指定了这些选项,则必须全部指定。另外,必须指定numPartitions。

  • 它们描述了从多个工作程序并行读取时如何对表进行分区。 partitionColumn必须是有关表中的数字列。后者暗示它只能是1列。

  • lowerBound和upperBound仅用于确定分区步幅,而不是用于过滤表中的行。因此,表中的所有行都将被分区并返回。