代码之家  ›  专栏  ›  技术社区  ›  Metadata

在使用Spark JDBC时,是否可以在partitionColumns中指定多个列?

  •  0
  • Metadata  · 技术社区  · 6 年前

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

    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 an non-zero exit code 143&GC开销问题。

    数据量很大,会导致分区的倾斜。 在观察了表中的数据之后,我了解到“source\u system\u name”不是对数据进行分区的正确列。但我发现其他三列的组合: source_system_name, org_code, period 最适合在读取和处理时分割数据(我做了一个'groupby'来找出表中的行数,数据在每个组中分布得有点均匀) 但我不知道如何使用spark jdbc中的所有三列 partitionColumn 选项。有人能告诉我在从RDBMS表读取数据时是否可以在option:partitionColumn中使用多列吗。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ged    6 年前

    否,以下适用:

    • 对于partitionColumn、lowerBound、upperBound-如果指定了其中任何一个选项,则必须全部指定这些选项。此外,必须指定numPartitions。

    • 它们描述了在并行读取多个worker时如何对表进行分区。partitionColumn必须是相关表中的数字列。后者意味着它只能是1列。

    • lowerBound和upperBound只是用来决定分区步长,而不是用来过滤表中的行。因此表中的所有行都将被分区并返回。