首页 > 解决方案 > 使用 spark-sql-jdbc 将记录从一个表复制到另一个表

问题描述

我正在尝试根据一个非常简单的要求在 pyspark 中进行 POC。作为第一步,我只是试图将表记录从一个表复制到另一个表。有 20 多张桌子,但起初,我试图只为一张桌子做这件事,后来将它增强为多张桌子。

当我尝试仅复制 10 条记录时,以下代码工作正常。但是,当我试图从主表中复制所有记录时,这段代码卡住了,最终我不得不手动终止它。由于主表有 100 万条记录,我原以为它会在几秒钟内发生,但它只是没有完成。

火花用户界面:

在此处输入图像描述

你能建议我应该如何处理吗?

Host : Local Machine
Spark verison : 3.0.0
database : Oracle

代码 :

from pyspark.sql import SparkSession
from configparser import ConfigParser

#read configuration file
config  = ConfigParser()
config.read('config.ini')

#setting up db credentials
url     = config['credentials']['dbUrl']
dbUsr   = config['credentials']['dbUsr']
dbPwd   = config['credentials']['dbPwd']
dbDrvr  = config['credentials']['dbDrvr']
dbtable = config['tables']['dbtable']

#print(dbtable)

# database connection 
def dbConnection(spark):

    pushdown_query = "(SELECT * FROM main_table) main_tbl"
    prprDF = spark.read.format("jdbc")\
        .option("url",url)\
        .option("user",dbUsr)\
        .option("dbtable",pushdown_query)\
        .option("password",dbPwd)\
        .option("driver",dbDrvr)\
        .option("numPartitions", 2)\
        .load()



    prprDF.write.format("jdbc")\
        .option("url",url)\
        .option("user",dbUsr)\
        .option("dbtable","backup_tbl")\
        .option("password",dbPwd)\
        .option("driver",dbDrvr)\
        .mode("overwrite").save()


if __name__ =="__main__":
    
    spark = SparkSession\
            .builder\
            .appName("DB refresh")\
            .getOrCreate()

    dbConnection(spark)
    spark.stop()

标签: apache-spark-sql

解决方案


看起来您只使用一个线程(执行程序)通过使用 JDBC 连接来处理数据。您可以检查 Spark UI 中的执行程序和驱动程序详细信息并尝试增加资源。还分享它失败的错误。您可以从同一 UI 中获取此信息,或使用 CLI 记录“yarn logs -applicationId”


推荐阅读