PySpark读取JDBC时如何设置upperBound与lowerBound日期格式
解决方案:PySpark读取Oracle JDBC日期分区列格式问题
方案一:将日期列转为数值类型分区
核心思路是把FEC_PART日期列转换为数值型(yyyymmdd格式本身是可直接比较的整数),让Spark按数值而非日期类型处理边界值,彻底规避日期格式解析冲突。
代码示例:
input_data = spark.read \ .format(constants.FORMAT_JDBC) \ .options(**properties) \ .option("partitionColumn", "CAST(FEC_PART AS NUMBER)") # 转换为数值型分区列 .option("lowerBound", "20200112") # 直接传入yyyymmdd格式的数值字符串 .option("upperBound", "20200114") .option("numPartitions", "2") \ .load()
方案二:正确配置Oracle会话与Spark日期格式
之前的尝试可能因驱动参数放置位置错误失效,需将Oracle驱动相关参数放入连接属性properties,而非单独用Spark的.option()设置:
- 先在
properties中添加驱动配置:
properties.update({ "oracle.jdbc.mapDateToTimestamp": "false", "sessionInitStatement": "ALTER SESSION SET NLS_DATE_FORMAT = 'YYYYMMDD'" })
- 再读取数据:
input_data = spark.read \ .format(constants.FORMAT_JDBC) \ .options(**properties) \ .option("partitionColumn", "FEC_PART") .option("lowerBound", "20200112") .option("upperBound", "20200114") .option("numPartitions", "2") \ .option("dateFormat", "yyyyMMdd") \ .load()
方案三:自定义查询手动控制分区逻辑
若上述方法仍无效,可直接用自定义SQL查询,手动指定日期过滤逻辑,同时通过numPartitions控制并行度:
# 拆分查询为多个区间(示例为2个分区) queries = [ "SELECT * FROM your_table WHERE FEC_PART >= TO_DATE('20200112','YYYYMMDD') AND FEC_PART < TO_DATE('20200113','YYYYMMDD')", "SELECT * FROM your_table WHERE FEC_PART >= TO_DATE('20200113','YYYYMMDD') AND FEC_PART <= TO_DATE('20200114','YYYYMMDD')" ] # 读取每个分区并合并 input_data = None for q in queries: df = spark.read \ .format(constants.FORMAT_JDBC) \ .options(**properties) \ .option("query", q) \ .load() input_data = df if input_data is None else input_data.unionByName(df)
内容的提问来源于stack exchange,提问作者Pachu Martinez
相关产品推荐
相关产品推荐

