1

我正在尝试使用 spark jdbc 从表中读取 5 亿条记录,然后对该表进行性能连接。当我从 sql developer 执行 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 表加载需要超过 18 小时,其他两个表需要 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 最大的标准,但对工作没有影响

4

1 回答 1

1

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

这可以按照https://stackoverflow.com/a/54375010/4326922中的说明完成,下面是 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()
于 2020-11-02T11:19:59.857 回答