我正在尝试使用PySpark和SQLAlchamy读取数据库表,如下所示:
SUBMIT_ARGS = "--jars mysql-connector-java-5.1.45-bin.jar pyspark-shell"
os.environ["PYSPARK_SUBMIT_ARGS"] = SUBMIT_ARGS
sc = SparkContext('local[*]', 'testSparkContext')
sqlContext = SQLContext(sc)
t0 = time.time()
database_uri = 'jdbc:mysql://{}:3306/{}'.format("127.0.0.1",<db_name>)
dataframe_mysql = sqlContext.read.format("jdbc").options(url=database_uri, driver = "com.mysql.jdbc.Driver", dbtable = <tablename>, user= <user>, password=<password>).load()
print(dataframe_mysql.rdd.map(lambda row :list(row)).collect())
t1 = time.time()
database_uri2 = 'mysql://{}:{}@{}/{}'.format(<user>,<password>,"127.0.0.1",<db_name>)
engine = create_engine(database_uri2)
connection = engine.connect()
s = text("select * from {}.{}".format(<db_name>,<table_name>))
result = connection.execute(s)
for each in result:
print(each)
t2= time.time()
print("Time taken by PySpark:", (t1-t0))
print("Time taken by SQLAlchamy", (t2-t1))
这是获取3100行所需的时间:
Time taken by PySpark: 12.326745986938477
Time taken by SQLAlchamy: 0.21664714813232422
为什么SQLAlchamy的表现优于PySpark?有没有办法让这更快?我的方法有什么错误吗?
答案 0 :(得分:5)
为什么SQLAlchamy的表现优于PySpark?有没有办法让这更快?我的方法有什么错误吗?
不止一个。最终,你尝试以一种不打算使用的方式使用Spark,测量不正确的东西并引入令人难以置信的间接量。总体:
DataSource
效率低下,因为您使用它是完全顺序的。检查Spark Gotchas中的parallellizing reads。local
模式(专为原型设计和单元测试而设计)只是一个顶级的樱桃。所以在一天结束时你的代码很慢,但它不是你在生产应用程序中使用的东西。 SQLAlchemy和Spark专为完全不同的目的而设计 - 如果您正在寻找低延迟数据库访问层,Spark不是正确的选择。