使用Databricks改善PySpark或Delta表中的join和Fuzzymtch性能

时间:2019-06-13 15:01:50

标签: apache-spark pyspark databricks azure-databricks

我正在使用7个不同的数据帧,其中3个来自容器/ blob存储中存储的CSV,另外4个来自sqldw中的查询。这些数据框来自不同的来源,但结构相同

enter image description here

我在联接后执行联接并消除空值,添加一列以注册它来自哪个源。一切都非常简单,但是对于我的最后一个,我执行了State的联接,然后进行了名称的模糊匹配。

enter image description here

我的数据框大约有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))

0 个答案:

没有答案