我正在尝试将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个不同的位置。无论如何,我可以根据表的分区列在位置读取分区中的表吗?
任何人都可以让我知道是否可以实施吗?
答案 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
)