如何在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
相关产品推荐
相关产品推荐

