apache-spark-sql - 使用 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()
解决方案
看起来您只使用一个线程(执行程序)通过使用 JDBC 连接来处理数据。您可以检查 Spark UI 中的执行程序和驱动程序详细信息并尝试增加资源。还分享它失败的错误。您可以从同一 UI 中获取此信息,或使用 CLI 记录“yarn logs -applicationId”
推荐阅读
- java - 将 Web 应用程序转换为 RESTful Web 服务
- purescript - purescript 中列表/数组中的类似记录类型
- angular - 如何清除我的 Angular 2 ng-if textarea 的值,以免它通过
- python-3.x - Python递归与改进
- r - 如何在使用 Microsoft R 的“remoteScript”执行 R 脚本时将控制台中的所有内容保存到文本文件?
- swift - (Swift) 如何使用 Segue 将 textField 传递给另一个 ViewController 下的 TableViewCell?
- java - 如何将 JComponents 放置在 Jframe 背景图像上?
- java - 找不到适合 jdbc:derby 的驱动程序
- java - 从 OpenAPI 生成 Spring MVC 映射时可以添加方法参数吗?
- swift - 如何制作一个空的 Int 变量?