【问题标题】:spark sql databricks - transaction log error after optimizespark sql databricks - 优化后的事务日志错误
【发布时间】:2021-08-30 19:27:40
【问题描述】:

我有两张表,写成这样:

f_em.write.format('delta').mode("overwrite").saveAsTable('rens.f_em')
f_dial.write.format('delta').mode("overwrite").saveAsTable('rens.f_dial')

这些表工作正常。我可以查询他们。但是,它们很大(大约 110 亿行),因此为了提高性能,我想优化它们。

%sql
optimize rens.f_em
zorder by (RKNR)

%sql
optimize rens.f_dial
zorder by (rknr)

我不知道优化究竟是如何工作的,以及 zorder by 究竟是如何工作的。我之前在另一个表上使用了优化功能,只是使用了我最常使用的属性在 zorder by 语句中进行链接/连接。这种增强效果显着,所以我在这里尝试了相同的方法。

运行优化语句后,我无法再从表中查询:

对于其中一个表,我在一个简单的选择语句后收到此错误

You are trying to read from `dbfs:/user/hive/warehouse/rens.db/f_em` using Databricks Delta, but there is no
transaction log present. Check the upstream job to make sure that it is writing
using format("delta") and that you are trying to read from the table base path.

To disable this check, SET spark.databricks.delta.formatCheck.enabled=false
To learn more about Delta, see https://docs.microsoft.com/azure/databricks/delta/index
;

还有其他错误:


Error in SQL statement: FileNotFoundException: dbfs:/user/hive/warehouse/rens.db/f_dial/_delta_log/00000000000000000000.json: Unable to reconstruct state at version 2 as the transaction log has been truncated due to manual deletion or the log retention policy (delta.logRetentionDuration=30 days) and checkpoint retention policy (delta.checkpointRetentionDuration=2 days)

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql databricks


    【解决方案1】:

    只是猜测:检查新查询的文件名。它在路径中查找数据

    dbfs:/user/hive/warehouse/rens.db/f_em
    

    但很可能您将表格保存到:

    dbfs:/user/hive/warehouse/rens.f_em .
    

    这可能是由于您在saveAsTable(rens.f_em) 中使用点符号。

    在 SQL 查询中,点被 SQL API 解释为数据库,而不是称为 rens.f_em 的增量表。

    编辑:鉴于您的回复,我想提出这样一个解决方法,由于稳健性,我个人一直使用和赞成。

    table_dir = "/path/to/table"
    f_em.write.format('delta').mode("overwrite").save(f"{table_dir} + /rens.f_em")
    
    spark.sql("CREATE DATABASE rens")
    spark.sql(f"CREATE rens.f_em USING DELTA delta.`{table_dir}/f_em`")
    
    spark.sql(f"OPTIMIZE delta.`{table_dir}/f_em` zorder by (RKNR)")
    
    

    【讨论】:

    • 感谢您与我一起思考。 saveAsTable 中的点用于表示数据库 rens,表名为 f_em。这按预期工作:在 saveAsTable 语句之后,我的数据库中有一个表 f_em,我可以从中查询。虽然优化语句搞砸了
    • 好的,谢谢您的信息。听起来像一个奇怪的错误。我通常使用这个工作流程,也许它有帮助: 1. 使用 write.format("delta").save("path") 保存 Delta 表 2. 在 HIVE 元存储中注册一个数据库并使用所需的路径将表注册到它3. 通过给出路径对 delta 表进行 OPTIMIZE 这工作非常健壮,只需多行一两行代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2020-07-07
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多