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

时间:2018-03-31 17:18:04

标签: apache-spark sqlalchemy 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))

这是获取3100行所需的时间:

Time taken by PySpark: 12.326745986938477
Time taken by SQLAlchamy: 0.21664714813232422

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

1 个答案:

答案 0 :(得分:5)

  

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

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

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

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