微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PySpark pyspark.sql.DataFrameReader.jdbc() 不接受日期时间类型上限参数,如文档所述

如何解决PySpark pyspark.sql.DataFrameReader.jdbc() 不接受日期时间类型上限参数,如文档所述

我在 PySpark 3.0.1 处的 jdbc 函数文档中找到了 https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrameReader,它说:

column – 数字、日期或时间戳类型的列的名称 将用于分区。

我认为它接受一个日期时间列来对查询进行分区。

所以我在 EMR-6.2.0 (PySpark 3.0.1) 上尝试了这个:

sql_conn_params = get_spark_conn_params()  # my function
sql_conn_params['column'] ='EVENT_CAPTURED'
sql_conn_params['numPartitions'] = 8
# sql_conn_params['upperBound'] = datetime.strptime('2016-01-01','%Y-%m-%d') # another trial
# sql_conn_params['lowerBound'] = datetime.strptime(''2016-01-10','%Y-%m-%d')
sql_conn_params['upperBound'] = '2016-01-01 00:00:00'
sql_conn_params['lowerBound'] = '2016-01-10 00:00:00'
df = (spark.read.jdbc(
    table=tablize(sql),**sql_conn_params
))
df.show()

我收到此错误

invalid literal for int() with base 10: '2016-01-01 00:00:00'
Traceback (most recent call last):
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/readwriter.py",line 625,in jdbc
    return self._df(self._jreader.jdbc(url,table,column,int(lowerBound),int(upperBound),ValueError: invalid literal for int() with base 10: '2016-01-01 00:00:00'

在这里查看了源代码 https://github.com/apache/spark/blob/master/python/pyspark/sql/readwriter.py#L865 发现它不支持文档所说的日期时间类型。

我的问题是:

代码所示,PySpark 中不支持 datetime 类型的分区列,但为什么文档说支持

谢谢,

解决方法

支持。

这里的问题是 spark.read.jdbc 方法目前仅支持整数类型列的参数上限/下限。

但是您可以使用 load 方法和 DataFrameReader.option 为其他列类型日期/时间戳指定 upperBoundlowerBound

df = spark.read.format("jdbc") \
    .option("url","jdbc:mysql://server/db") \
    .option("dbtable","table_name") \
    .option("user","user") \
    .option("password","xxxx") \
    .option("partitionColumn","EVENT_CAPTURED") \
    .option("lowerBound","2016-01-01 00:00:00") \
    .option("upperBound","2016-01-10 00:00:00") \
    .option("numPartitions","8") \
    .load()

或者通过传递选项的字典:

df = spark.read.format("jdbc") \
    .options(*sql_conn_params)\
    .load()

您可以在此处查看所有可用选项和示例:https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?