在Databricks中使用PyDeequ ColumnProfilerRunner报错KeyError: 'StringColumnProfile'
问题描述
在Databricks中使用pydeequ,已通过Maven安装com.amazon.deequ:deequ:2.0.4-spark-3.3,Analyzers功能正常,但运行官方示例的ColumnProfilerRunner代码时触发KeyError: 'StringColumnProfile'。
问题原因
pydeequ的Python端代码与Java端deequ 2.x版本的类名不兼容:deequ 2.x将字符串类型的列分析类重命名为StringColumnProfile,但旧版本的pydeequ中ColumnProfilesBuilder的columnProfileClasses字典未添加该类名的映射,导致无法识别Java端返回的类实例。
解决方案
方案1:升级pydeequ到兼容版本
安装与deequ 2.0.4-spark-3.3匹配的pydeequ版本,确保Python端代码适配Java端的类名变化:
pip install pydeequ==0.1.10 --upgrade
(注:0.1.10及以上版本已适配deequ 2.x的类名变更)
方案2:动态添加类名映射(无需升级)
如果无法升级pydeequ,可在代码中手动给ColumnProfilesBuilder添加StringColumnProfile的映射:
from pydeequ.profiles import * # 手动添加类名映射 ColumnProfilesBuilder.columnProfileClasses['StringColumnProfile'] = StringProfile # 正常运行ColumnProfilerRunner代码 result = ColumnProfilerRunner(spark) \ .onData(df) \ .run()
方案3:修改pydeequ源码(临时应急)
找到pydeequ安装目录下的profiles.py文件(示例路径:/local_disk0/.ephemeral_nfs/envs/pythonEnv-f96b57df-8a1b-408f-821a-896e4943bb1a/lib/python3.9/site-packages/pydeequ/profiles.py),修改ColumnProfilesBuilder类的__init__方法,在columnProfileClasses字典中添加映射:
class ColumnProfilesBuilder: def __init__(self, spark_session): self._spark_session = spark_session self._jvm = spark_session._jvm self.columnProfileClasses = { "NumericColumnProfile": NumericProfile, "StringColumnProfile": StringProfile, # 添加这一行 "BooleanColumnProfile": BooleanProfile, "DateTimeColumnProfile": DateTimeProfile, "UnknownColumnProfile": UnknownProfile } # 其余代码保持不变
内容的提问来源于stack exchange,提问作者Azul Selser

