apache-spark - 如果列的数据类型为: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 吗?
谁能告诉我它是否可以实施?
解决方案
您可以为此使用谓词选项。它需要一个字符串数组,数组中的每一项都是对源表进行分区的条件。由这些条件确定的分区总数。
val preds = Array[String]("location = 'LOC1'", "location = 'LOC2' || location = 'LOC3'")
val df = spark.read.jdbc(
url = databaseUrl,
table = tableName,
predicates = preds,
connectionProperties = properties
)
推荐阅读
- windows - Windows 或 Windows 安装程序未在应用程序搜索上更新程序图标
- navicat - 如何更改 Navicat 中查询结果选项卡的名称?
- linux - 从 csv 文件中删除非 ascii 特殊字符
- apache-kafka-streams - 从ProcessorContext获取状态存储时是否可能出现InvalidStateStoreException?
- python - 使用元组键从字典创建 MultiIndex pandas DataFrame
- ruby-on-rails - Rails Docker 容器的 AWS 任务不断退出,服务器给出 503 错误
- java - 我应该为每个休息调用打开一个 JDBC 连接吗?
- r - 将数值转换为时间跨度格式
- android - 如何在recyclerview中设置每个cardview的位置?
- linear-regression - 即使使用预测()的 NA,如何进行预测?