为什么spark在jdbc方面比sqoop慢?

ibrsph3r  于 2021-06-03  发布在  Sqoop
关注(0)|答案(2)|浏览(588)

可以理解,当从oracledb迁移/加载到hdfs/parquet时,最好使用sqoop而不是带有jdbc驱动程序的spark。
Spark应该是100倍快时,处理的权利?那spark怎么了?为什么人们在从oracledb表加载数据时更喜欢sqoop?
请建议我应该做什么,使Spark更快地加载数据时,从甲骨文。

9jyewag0

9jyewag01#

亚历克斯的回答中已经提到了要点。
我只想再举个例子,

from pyspark.sql import SparkSession

spark = SparkSession.builder.master("local[4]").appName("Test-JDBC").getOrCreate()

ds = spark.read.jdbc("jdbc:mysql://localhost:3306/stackexchange", "(select min(id), max(id) from post_history) as ph",
                     properties={"user": "devender", "password": "*****", "driver": "com.mysql.jdbc.Driver"})

r = ds.head()
minId = r[0]
maxId = r[1]

ds = spark.read.jdbc("jdbc:mysql://localhost:3306/stackexchange", "(select * from post_history) as ph",
                     properties={"user": "devender", "password": "*****", "driver": "com.mysql.jdbc.Driver"},
                     numPartitions=4, column="id", lowerBound=minId, upperBound=maxId)

count = ds.count()
print(count)

更多细节,https://gist.github.com/devender-yadav/5c4328918602b7910ba883e18b68fd87
注意:sqoop自动执行边界查询以获取按列拆分的最小值和最大值(该查询也可以被重写)

jum4pzuy

jum4pzuy2#

spark知道如何并行查询时速度很快。如果您只是执行一个查询,那么spark不知道该做什么。通过使用参数可以提高速度 lowerBound , upperBound , numPartitions 使用读取数据时 spark.read.jdbc ,但这实际上取决于您的table的设计。
您可以在这里找到更多文档。

相关问题