如果列的数据类型为字符串,是否可以在Spark-JDBC的“ option(“ partitionColumn”,“ colname”)”中定义“ partitionColumn”?

时间:2018-09-27 05:45:06

标签: apache-spark apache-spark-sql rdbms spark-jdbc

我正在尝试将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()

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

任何人都可以让我知道是否可以实施吗?

1 个答案:

答案 0 :(得分:1)

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

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

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