【发布时间】:2018-10-05 12:04:07
【问题描述】:
我正在尝试读取 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()
我的工作因以下消息而失败:Container exited with a non-zero exit code 143 & GC Overhead issue。
数据量很大,导致分区倾斜。
观察表中的数据后,我了解到“source_system_name”不是对数据进行分区的正确列。但我发现其他三列的组合:source_system_name, org_code, period 最适合在读取和处理时拆分数据。 (我做了一个'group by'来找出表中的行数,并且数据在每个组中分布得有点均匀)
但我不知道如何使用 spark-jdbc 的 partitionColumn 选项中的所有三列。谁能告诉我是否可以在选项中使用多个列:partitionColumn while reading data from an RDBMS table.
【问题讨论】:
-
这是一次性的还是需要重复多次的?
-
我必须临时运行它。无论何时需要,但我认为如果实施成功,它将被更多地使用。
-
你能改变你的源表来提供一个唯一的递增整数列吗?如果是这样,工作就完成了。
-
有一个列:forecast_id,它是一个唯一的整数列。但是表中有数百万行,如何将partitionColumn定义为预测并使用forecast_id决定lowerBound,upperBound,partitionColumn。
-
我认为唯一性不足以消除歪斜的可能性。您需要确保它们的相关值分布相当均匀。如果您使用递增的整数字段,则您知道第一个值为零,因此您只需要一个简单的 select 语句来确定上限。
标签: apache-spark