我正在尝试读取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表读取数据。
答案 0 :(得分:1)
不,以下情况适用:
对于partitionColumn,lowerBound,upperBound-如果指定了这些选项,则必须全部指定。另外,必须指定numPartitions。
它们描述了从多个工作程序并行读取时如何对表进行分区。 partitionColumn必须是有关表中的数字列。后者暗示它只能是1列。
lowerBound和upperBound仅用于确定分区步幅,而不是用于过滤表中的行。因此,表中的所有行都将被分区并返回。