这是一个非常奇怪的问题——它没有像预期的那样获取数据,而是将每一行作为标题的副本返回。每个单元格都是列名的文字字符串。
如果我不使用像下面这样的查询而只是放置表,它会在尝试将文字列名称转换为其数据类型时出错,例如,它会尝试将字面意义上的“dob”转换为日期。我发帖是因为我在网上其他地方没有看到任何关于类似问题的信息。我尝试了多个版本的 JDBC 驱动程序,所以我不知道从哪里开始。
重现代码(网络和用户信息已删除):
##import required libraries
import pyspark
##create spark session
spark = pyspark.sql.SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config('spark.driver.extraClassPath', "/Users/username/Downloads/mariadb-java-client-2.7.3.jar") \
.getOrCreate()
##read table from db using spark jdbc
patients_df = spark.read \
.format("jdbc") \
.option("url", "jdbc:mariadb:my_server:3306/SYNTH_EHR_NORM") \
.option("dbtable", "(select fname, lname from SYNTH_EHR_NORM.PATIENTS limit 20) tmp") \
.option("user", "username") \
.option("password", "not_my_real_password") \
.option("driver", "org.mariadb.jdbc.Driver") \
.load()
##print the users dataframe
print(patients_df.collect())
返回:
[Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname'), Row(fname='fname', lname='lname')]