首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化PySpark代码以获得更好的性能

如何优化PySpark代码以获得更好的性能
EN

Stack Overflow用户
提问于 2022-08-18 05:55:26
回答 2查看 269关注 0票数 0

我试图获取表(Delta表)最后一次优化的时间,使用下面的代码和获得预期的输出。此代码将用于数据库中存在的所有表。

代码语言:javascript
复制
table_name_or_path = "abcd"

df = spark.sql("desc history {}".format(table_name_or_path)).select("operation","timestamp").filter("operation == 'OPTIMIZE'").orderBy(col("timestamp").desc())
if len(df.take(1)) != 0:
    last_optimize = df.select(col("timestamp").cast("string").alias("timestamp")).first().asDict()
    print(last_optimize["timestamp"])
    last_optimize = last_optimize["timestamp"]
else:
    last_optimize = ""

上面的代码将需要一些时间,它将触发许多火花作业。

我想优化上面的代码以获得更好的性能。

是否有任何方法来编写优化的代码,这将更有帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-18 07:43:20

最好避免像if len(df.take(1)) != 0这样的检查,因为它可能导致在以后执行.first()时重新计算结果。相反,只需使用.limit(1)限制行数,并检查收集项的结果。类似的东西(未经测试):

代码语言:javascript
复制
table_name_or_path = "abcd"

df = spark.sql(f"desc history {table_name_or_path}") \
  .select("operation","timestamp") \
  .filter("operation == 'OPTIMIZE'").orderBy(col("timestamp").desc()) \
  .limit(1)

data = df.collect()
if len(data) > 0:
    last_optimize = data[0].asDict()
    print(last_optimize["timestamp"])
    last_optimize = last_optimize["timestamp"]
else:
    last_optimize = ""
票数 1
EN

Stack Overflow用户

发布于 2022-08-18 06:01:45

通常,在开始对数据帧进行任何计算之前,当您缓存数据帧时,它通常会有所帮助。

代码语言:javascript
复制
df = spark.sql("desc history {}".format(table_name_or_path)).select("operation","timestamp").filter("operation == 'OPTIMIZE'").orderBy(col("timestamp").desc()).cache()

我假设这里缓存的orderBy步骤已经减少了计算量

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73398052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档