来自 MariaDB 的 Pyspark.read 获取重复的标题行而不是数据

数据挖掘 数据框 pyspark
2022-03-12 01:33:13

这是一个非常奇怪的问题——它没有像预期的那样获取数据,而是将每一行作为标题的副本返回。每个单元格都是列名的文字字符串。

如果我不使用像下面这样的查询而只是放置表,它会在尝试将文字列名称转换为其数据类型时出错,例如,它会尝试将字面意义上的“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')]
1个回答

有时向子查询添加别名会使 PySpark 感到困惑尝试:

.option("dbtable", "select fname, lname from SYNTH_EHR_NORM.PATIENTS limit 20") \