可以理解,从oracle db迁移/加载到hdfs / parquet时,最好使用SQOOP而不是带有JDBC驱动程序的SPARK。
当处理正确时,火花应该快100倍吗? 那么Spark有什么问题呢? 为什么人们在从oracle数据库表加载数据时更喜欢SQOOP?
请建议我从oracle加载数据时,我应该怎么做才能使Spark更快。
答案 0 :(得分:3)
Spark知道如何并行化查询时速度很快。如果仅执行单个查询,那么Spark不知道该怎么办。使用lowerBound
读取数据时,可以通过使用参数upperBound
,numPartitions
,spark.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值(该查询也可以被覆盖)