Apache spark 使用PySpark读取数据库的最快方法是什么?
我正在尝试使用PySpark和SQLAlchamy读取数据库表,如下所示:Apache spark 使用PySpark读取数据库的最快方法是什么?,apache-spark,sqlalchemy,pyspark,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=时间。时间() database_ur
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=时间。时间()
database_uri='jdbc:mysql://{}:3306/{}'。格式(“127.0.0.1”,)
dataframe\u mysql=sqlContext.read.format(“jdbc”).options(url=database\u uri,driver=“com.mysql.jdbc.driver”,dbtable=,user=,password=).load()
打印(dataframe_mysql.rdd.map(lambda行:list(row)).collect())
t1=时间。时间()
数据库2='mysql://{}:{}@{}/{}'。格式(,,“127.0.0.1,,)
引擎=创建引擎(数据库2)
连接=引擎。连接()
s=文本(“从{}.{}中选择*格式(,))
结果=连接。执行
对于每个结果:
打印(每个)
t2=时间。时间()
打印(“PySpark所用的时间:,(t1-t0))
打印(“SQLAlchamy花费的时间”(t2-t1))
这是获取大约3100行所需的时间:
Time taken by PySpark: 12.326745986938477
Time taken by SQLAlchamy: 0.21664714813232422
为什么SQLAlchamy的表现优于PySpark?有没有办法让这更快?我的方法有错误吗
为什么SQLAlchamy的表现优于PySpark?有没有办法让这更快?我的方法有错误吗
不止一个。最终,您尝试以一种不打算使用的方式使用Spark,测量不正确的东西,并引入难以置信的间接量。总体而言:
- JDBC
效率低下,而且在使用时完全是顺序的。登记Spark GotchasDataSource
- 收集数据并非用于实际生产
- 通过将数据转换为RDD并序列化、提取到驱动程序和反序列化,您引入了很多间接寻址
- 您的代码不仅度量数据处理时间,还度量集群/上下文初始化时间
模式(为原型设计和单元测试而设计)只是顶部的一颗樱桃local
- 等等
所以在一天结束时,您的代码是缓慢的,但它不是您在生产应用程序中使用的东西。SQLAlchemy和Spark是为完全不同的目的而设计的-如果您正在寻找低延迟数据库访问层,Spark不是正确的选择。Hi@用户9579544,为了便于读取数据,我添加了一些配置,如
partitionColumn
,上限
,下限
,以及numofPartitions
,但仍然没有更改。另外,collect()
的生产级替代方案是什么?@gourxb Spark是一个并行计算框架。你有大量的数据要转换你计算结果,你把它写进db/file/nosql。。。然后使用可视化工具来存储结果