首页 > 解决方案 > ConstraintSuggestionRunner 不占用用反引号括起来的列

问题描述

我目前正在从 excel 工作表中导入数据集,该工作表的列名带有像这样的点字符"abc.xyz"

我经历了几个 stackOverflow 问题,它说我们可以用带有反引号的列名替换它,如下所示"'abc.xyz'":因此,我将所有包含点的列名重命名为相同的名称,但用反引号括起来,如下所示:

df.columns.foreach(item => {
      if(item.contains("."))
        {
          df.withColumnRenamed(item, s"`$item`")
        }
    })

现在,当我在 ConstraintSuggestionRunner 类中传递这个数据框时,如下所示:

val suggestionResult = ConstraintSuggestionRunner()
      .onData(df)
      .addConstraintRules(Rules.DEFAULT)
      .setKLLParameters(KLLParameters(sketchSize = 2048, shrinkingFactor = 0.64, numberOfBuckets = 10))
      .run()

我收到如下错误:

错误主要:org.apache.spark.sql.AnalysisException:无法解析 '`abc.xyz`'给定的输入列:

如何解决此错误?

标签: scalaapache-sparkapache-spark-sqlamazon-deequ

解决方案


转义必须在 Deequ 中处理,但问题始终是开放的。您在这里所做的是将反引号添加为列名的一部分,而不是转义它们。

您可以尝试用下划线之类的另一个字符替换点,_然后将带有重命名列的数据框传递给ConstraintSuggestionRunner

val df1 = df.toDF(df.columns.map(_.replaceAll("[.]+", "_")):_*)

val suggestionResult = ConstraintSuggestionRunner()
      .onData(df1)
      .addConstraintRules(Rules.DEFAULT)
      .setKLLParameters(KLLParameters(sketchSize = 2048, shrinkingFactor = 0.64, numberOfBuckets = 10))
      .run()

推荐阅读