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`' 给定输入列:

我该如何解决这个错误

解决方法

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

您可以尝试用下划线 _ 等其他字符替换点,然后将带有重命名列的数据框传递给 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()