constraintsuggested runner不占用带反引号的列



我目前正在从一个excel表格中导入数据集,该表格的列名带有点字符,如"abc.xyz".

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

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

现在,当我像这样在constraintsuggested runner类中传递这个数据框时:

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

我得到如下错误:

ERROR Main: org.apache.spark.sql.AnalysisException: cannot resolve'`abc.xyz`'给定输入列:

如何解决这个错误?

转义必须在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()

最新更新