You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure Databricks中解析SHOW TABLE EXTENDED的information列?

解析Azure Databricks中SHOW TABLE EXTENDED返回的information列

问题核心:SHOW TABLE EXTENDED返回的information列是多行自定义键值格式,并非JSON结构,直接用from_json无法解析,需要通过字符串清洗+键值提取的方式处理。

解决方案步骤

1. 清洗并拆分多行内容

首先处理information中的跨行字段(比如Serde Library、OutputFormat这类值换行的情况),将其合并为单行键值对,再按行拆分。

import pyspark.sql.functions as F

# 读取原始查询结果
raw_df = spark.sql("SHOW TABLE EXTENDED LIKE 'employe*'")

# 合并跨行的字段值(将换行+缩进的内容拼接回上一行)
cleaned_df = raw_df.withColumn(
    "clean_info",
    F.regexp_replace(F.col("information"), "\\n\\s+", " ")
).withColumn(
    "info_rows",
    F.split(F.col("clean_info"), "\\n")  # 按换行拆分每行键值对
)

2. 转换为键值对Map

将拆分后的每行转换为独立的键值对,再聚合为Map类型,方便后续提取目标字段。

# 拆分每行的键和值,聚合为Map结构
key_value_df = cleaned_df.withColumn(
    "key_value",
    F.explode(F.col("info_rows"))
).withColumn(
    "key",
    F.trim(F.split(F.col("key_value"), ":")[0])
).withColumn(
    "value",
    F.trim(F.expr("substring(key_value, instr(key_value, ':') + 1)"))
).groupBy("database", "tableName", "isTemporary").agg(
    F.map_from_entries(F.collect_list(F.struct("key", "value"))).alias("info_map")
)

3. 提取目标字段

从Map中直接提取所需字段,对于特殊格式的字段(如Table Properties)可额外解析为结构化数据。

# 提取基础字段
result_df = key_value_df.withColumn("Database", F.col("info_map")["Database"]) \
    .withColumn("Table", F.col("info_map")["Table"]) \
    .withColumn("Owner", F.col("info_map")["Owner"]) \
    .withColumn("Created_Time", F.col("info_map")["Created Time"]) \
    .withColumn("Location", F.col("info_map")["Location"]) \
    .withColumn("Schema", F.col("info_map")["Schema"])

# 解析Table Properties为Map(可选)
result_df = result_df.withColumn(
    "table_properties_str",
    F.regexp_replace(F.col("info_map")["Table Properties"], "\\[|\\]", "")
).withColumn(
    "table_properties",
    F.map_from_entries(
        F.transform(
            F.split(F.col("table_properties_str"), ","),
            lambda x: F.struct(F.trim(F.split(x, "=")[0]), F.trim(F.split(x, "=")[1]))
        )
    )
)

# 查看最终结果
result_df.select("database", "tableName", "Owner", "Created_Time", "Location", "table_properties").show(truncate=False)

关键说明

  • from_json无效原因:information列是自定义的多行键值格式,不符合JSON语法规则,无论设置什么参数都无法被JSON解析器识别。
  • 正则适配:如果你的环境中缩进格式不同(比如制表符而非空格),需要调整\\n\\s+为对应正则表达式(如\\n\\t+)。
  • 空值处理:部分表可能缺少某些字段,可使用coalesce(F.col("info_map")["XXX"], F.lit("N/A"))避免出现null值。

内容的提问来源于stack exchange,提问作者Ash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:55:59