使用 spark JDBC 从 Oracle table 加载数据非常慢

Loading data from Oracle table using spark JDBC is extremely slow

我正在尝试使用 spark jdbc 从 table 读取 5 亿条记录,然后在 tables 上进行性能连接。 当我执行来自 sql 开发人员的 sql 时,需要 25 分钟。 但是当我使用 spark JDBC 加载它时,上次它 运行 需要永远 18 个小时,然后我取消了它。 我为此使用 AWS-GLUE。

这就是我使用 spark 阅读的方式 jdbc

df = glueContext.read.format("jdbc")
.option("url","jdbc:oracle:thin://abcd:1521/abcd.com")
.option("user","USER_PROD")
.option("password","ffg#Prod")
.option("numPartitions", 15)
.option("partitionColumn", "OUTSTANDING_ACTIONS")
.option("lowerBound", 0)
.option("upperBound", 1000)
.option("dbtable","FSP.CUSTOMER_CASE")
.option("driver","oracle.jdbc.OracleDriver").load()

customer_casedf=df.createOrReplaceTempView("customer_caseOnpremView")

我使用了 partitionColumn OUTSTANDING_ACTIONS 这里是数据分布 第 1 列是 partitionColumn,第二列是它们的出现

1   8988894
0   4227894
5   2264259
9   2263534
8   2262628
2   2261704
3   2260580
4   2260335
7   2259747
6   2257970

这是我的加入,其中 customer_caseOnpremView table 加载需要超过 18 小时,其他两个 table 需要 1 分钟

ThirdQueryResuletOnprem=spark.sql("SELECT CP.CLIENT_ID,COUNT(1) NoofCases FROM customer_caseOnpremView CC JOIN groupViewOnpremView FG ON FG.ID = CC.OWNER_ID JOIN   client_platformViewOnpremView CP ON CP.CLIENT_ID = SUBSTR(FG.PATH, 2, INSTR(FG.PATH, '/') + INSTR(SUBSTR(FG.PATH, 1 + INSTR(FG.PATH, '/')), '/') - 2) WHERE FG.STATUS = 'ACTIVE' AND FG.TYPE = 'CLIENT' GROUP BY CP.CLIENT_ID")

请建议如何让它更快。 我没有工人从 10 到 40 我已经使用 Executor 类型标准到 GP2 最大的一个但对工作没有影响

由于您的查询有很多过滤器,您甚至不需要引入整个数据集然后对其应用过滤器。但是您可以将此查询向下推送到数据库引擎,后者将过滤数据并 return 返回 Glue 作业的结果。

这可以按照 中的说明进行,下面是 mysql 的示例,只需稍加改动即可应用于 oracle。

query= "(select ab.id,ab.name,ab.date1,bb.tStartDate from test.test12 ab join test.test34 bb on ab.id=bb.id where ab.date1>'" + args['start_date'] + "') as testresult"

datasource0 = spark.read.format("jdbc").option("url", "jdbc:mysql://host.test.us-east-2.rds.amazonaws.com:3306/test").option("driver", "com.mysql.jdbc.Driver").option("dbtable", query).option("user", "test").option("password", "Password1234").load()