为什么 spark 在 jdbc 时比 sqoop 慢?

Why spark is slower when compared to sqoop , when it comes to jdbc?

据了解,从 oracle db migrating/load 到 hdfs/parquet 时,首选使用 SQOOP 而不是 SPARK 和 JDBC 驱动程序。

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

请建议我在从 oracle 加载数据时需要做什么才能使 Spark 更快。

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

您可以找到更多文档 here

A​​lex 的回答中已经涵盖了要点。

我只是想补充一个例子,

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