首页 > 解决方案 > 如果列的数据类型为:String,是否可以在 Spark-JDBC 的“option(”partitionColumn“,”colname“)”中定义“partitionColumn”?

问题描述

我正在尝试将数据从 RDBMS 加载到 HDFS 上的配置单元表中。我正在通过以下方式读取 RDBMS 表:

val mydata = spark.read
  .format("jdbc")
  .option("url", connection)
  .option("dbtable", "select * from dev.userlocations")
  .option("user", usrname)
  .option("password", pwd)
  .option("numPartitions",20)
  .load()

我在执行程序日志中看到option("numPartitions",20)没有正确给出,并且整个数据都转储到了一个执行程序中。

现在有提供分区列、下限和上限的选项,如下所示:

val mydata = spark.read
  .format("jdbc")
  .option("url", connection)
  .option("dbtable", "select * from dev.userlocations")
  .option("user", usrname)
  .option("password", pwd)
  .option("partitionColumn","columnName")
  .option("lowerbound","x")
  .option("upperbound","y")
  .option("numPartitions",20).load()

仅当我的分区列是数字数据类型时,上述一个才有效。在我正在阅读的表中,它是基于 column 分区的location。它的整体大小为 5gb,表中有 20 个不同的分区。我在表中有 20 个不同的位置。无论如何我可以根据表的分区列读取分区中的表: location 吗?

谁能告诉我它是否可以实施?

标签: apache-sparkapache-spark-sqlrdbmsspark-jdbc

解决方案


您可以为此使用谓词选项。它需要一个字符串数组,数组中的每一项都是对源表进行分区的条件。由这些条件确定的分区总数。

val preds = Array[String]("location = 'LOC1'", "location = 'LOC2' || location = 'LOC3'")

val df = spark.read.jdbc(
  url = databaseUrl,
  table = tableName,
  predicates = preds,
  connectionProperties = properties
)

推荐阅读