我目前正在从一个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()