我正在尝试将数据从RDBMS加载到HDFS上的hive表。我以如下方式读取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()上面的方法只有在分区列是numeric数据类型的情况下才有效。在我正在读取的表中,它是基于列location进行分区的。它的总大小是5 5gb &表中有20个不同的分区。我在表中有20个不同的位置。有没有什么方法可以根据表的分区列在分区中读取表: location?
有没有人可以让我知道它是否可以实现?
发布于 2018-09-27 14:53:20
为此,您可以使用predicates选项。它接受一个字符串数组,数组中的每一项都是对源表进行分区的条件。由这些条件确定的分区总数。
val preds = Array[String]("location = 'LOC1'", "location = 'LOC2' || location = 'LOC3'")
val df = spark.read.jdbc(
url = databaseUrl,
table = tableName,
predicates = preds,
connectionProperties = properties
)https://stackoverflow.com/questions/52530171
复制相似问题