我通过jdbc
连接到一个包含500&#39,000' 000行和14列的数据库。
以下是使用的代码:
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
properties = {'jdbcurl': 'jdbc:db:XXXXXXXXX','user': 'XXXXXXXXX', 'password': 'XXXXXXXXX'}
data = spark.read.jdbc(properties['jdbcurl'], table='XXXXXXXXX', properties=properties)
data.show()
上面的代码花了 9秒来显示数据库的前20行。
后来我通过
创建了一个SQL临时视图data[['XXX','YYY']].createOrReplaceTempView("ZZZ")
我运行了以下查询:
sqlContext.sql('SELECT AVG(XXX) FROM ZZZ').show()
上面的代码 1355.79秒(大约23分钟)。这个可以吗?这似乎是一个很长的时间。
最后我试着计算DB的行数
sqlContext.sql('SELECT COUNT(*) FROM ZZZ').show()
2848.95秒(约48分钟)。
我做错了什么或这些金额是标准的吗?
答案 0 :(得分:0)
当你用这种方法读取jdbc源时,你会失去并行性,这是spark的主要优点。请阅读official spark jdbc guidelines,特别是关于partitionColumn
,lowerBound
,upperBound
和numPartitions
。这将允许spark并行运行多个JDBC查询,从而产生分区数据帧。
同样调整fetchsize
参数可能对某些数据库有所帮助。