使用PySpark读取数据库的最快方法是什么?

gou*_*rxb 3 sqlalchemy apache-spark pyspark

我试图使用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))
Run Code Online (Sandbox Code Playgroud)

这是获取大约3100行所花费的时间:

Time taken by PySpark: 12.326745986938477
Time taken by SQLAlchamy: 0.21664714813232422
Run Code Online (Sandbox Code Playgroud)

为什么SQLAlchamy的性能优于PySpark?有没有办法让这更快?我的方法有什么错误吗?

小智 5

为什么SQLAlchamy的性能优于PySpark?有没有办法让这更快?我的方法有什么错误吗?

超过一个.最终,你尝试以一种不打算使用的方式使用Spark,测量不正确的东西并引入令人难以置信的间接量.总体:

  • JDBC DataSource效率很低,而且使用它是完全顺序的.检查Spark Gotchas中的并行读取.
  • 收集数据不适合在实践中用于生产.
  • 您通过将数据转换为RDD并序列化,获取驱动程序和反序列化来引入大量间接.
  • 您的代码不仅测量数据处理时间,还测量集群/上下文初始化时间.
  • local 模式(专为原型设计和单元测试而设计)只是一个顶级的樱桃.
  • 等等...

因此,在一天结束时,您的代码很慢,但它不是您在生产应用程序中使用的东西.SQLAlchemy和Spark专为完全不同的目的而设计 - 如果您正在寻找低延迟数据库访问层,Spark不是正确的选择.