我正在使用7个不同的数据帧,其中3个来自容器/ blob存储中存储的CSV,另外4个来自sqldw中的查询。这些数据框来自不同的来源,但结构相同
我在联接后执行联接并消除空值,添加一列以注册它来自哪个源。一切都非常简单,但是对于我的最后一个,我执行了State的联接,然后进行了名称的模糊匹配。
我的数据框大约有50万行,但此联接之后达到3000万行,执行联接和模糊匹配需要30分钟以上。
我阅读了有关增量表及其如何真正快速处理PB的信息。我还不太了解它是如何工作的。我曾尝试从教程中创建增量文件和增量表,但是当我运行代码时,花了一个多小时才创建了增量表。
有人可以帮助我优化吗?使用镶木地板或三角桌子,不确定哪种是最佳方法。
我的笔记本电脑连接配置如下:
### STORAGE ACCOUNT ###
storage_account_name = "[storageAccount]"
container_name = "[containerName]"
storage_account_access_key = "[key1]"
temp_blob_name = "[blobPath]"
storage_account_account_key = "fs.azure.account.key.{}.blob.core.windows.net".format(storage_account_name)
inputSource = "wasbs://{}@{}.blob.core.windows.net".format(container_name, storage_account_name)
spark.conf.set(
storage_account_account_key,
storage_account_access_key)
spark._jsc.hadoopConfiguration().set(
storage_account_account_key,
storage_account_account_key)
### DW DATABASE ###
dwDatabase = "[database]"
dwServer = "[server]"
dwJdbcPort = "[port]"
dwUser = "[user]"
dwPass = "[password]"
dwJdbcExtraOptions = "encrypt=true;trustServerCertificate=true;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"
sqlDwUrl = "jdbc:sqlserver://" + dwServer + ":" + dwJdbcPort + ";database=" + dwDatabase + ";user=" + dwUser+";password=" + dwPass + ";$dwJdbcExtraOptions"
sqlDwUrlSmall = "jdbc:sqlserver://" + dwServer + ":" + dwJdbcPort + ";database=" + dwDatabase + ";user=" + dwUser+";password=" + dwPass
spark.conf.set(
"spark.sql.parquet.writeLegacyFormat",
"true")
并阅读我的DataFrames:
### CSVs ###
df_csv = spark.read \
.format('csv') \
.option("inferSchema", "true") \
.option("delimiter", ";") \
.option("header", "true") \
.load(inputSource + "/sftp_files/{}/{}".format(dateFolder, fileName))
### SQL ###
df_sql = spark.read \
.format("com.databricks.spark.sqldw") \
.option("url", sqlDwUrlSmall) \
.option("tempDir", inputSource + temp_blob_name) \
.option("forwardSparkAzureStorageCredentials", "true") \
.option("query", queryText) \
.load()
模糊匹配后,我有这个:
df = df\
.orderBy(['Name','State','bestScore'], ascending=[True,True,False], na_position='last')\
.drop_duplicates(subset=['ID'])
threshold = 85
df = df.filter('bestScore >= {}'.format(threshold))