为什么在jdbc上,火花比sqoop慢?

时间:2019-05-24 08:15:59

标签: apache-spark jdbc sqoop datastax

可以理解,从oracle db迁移/加载到hdfs / parquet时,最好使用SQOOP而不是带有JDBC驱动程序的SPARK。

当处理正确时,火花应该快100倍吗? 那么Spark有什么问题呢? 为什么人们在从oracle数据库表加载数据时更喜欢SQOOP?

请建议我从oracle加载数据时,我应该怎么做才能使Spark更快。

2 个答案:

答案 0 :(得分:3)

Spark知道如何并行化查询时速度很快。如果仅执行单个查询,那么Spark不知道该怎么办。使用lowerBound读取数据时,可以通过使用参数upperBoundnumPartitionsspark.read.jdbc来提高速度,但这实际上取决于表的设计。

您可以找到更多文档here

答案 1 :(得分:0)

Alex的答案已经涵盖了重点。

我只想添加一个例子,

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自动执行边界查询以获取分隔列的MIN,MAX值(该查询也可以被覆盖)