Spark Java:矢量汇编程序列名称中的转义点

Spark Java: Escape dot in column names for vector assembler

我有一个数据集,其中一些列名带有点。当涉及到 Vector Assembler 时,问题就出现了。好像他们不合得来,所以我尝试了很多方法来逃避这些点,但没有任何改变。

String[] expincols = newfilenameavgpeaks.columns();

VectorAssembler assemblerexp = new VectorAssembler()
                    .setInputCols(expincols)
                    .setOutputCol("intensity");

Dataset<Row> filenameoutput = assemblerexp.transform(newfilenameavgpeaks);

我用 expincols 包裹了每个元素:“`”、“``”、“```”、“````”、“'”、'“' 等等,但什么也没有!我也在 newfilenameavgpeaks 的列名中尝试了这些,但仍然一无所获。知道如何转义吗?

如果数据集包含列 a.b,您仍然可以使用 df.col(`a.b`) 到 select 名称中带有 . 的列。这是有效的,因为 Dataset.col tries to resolve 列名并且可以处理反引号。

VectorAssembler.transform however takes the schema of the supplied dataset and uses this StructType to handle the column names in VectorAssembler.transformSchema. The apply method of StructType 根本不包含处理反引号的逻辑,如果列名不完全匹配则抛出 IllegalArgumentException

因此,唯一的选择是在将列提供给 VectorAssembler 之前重命名这些列:

Dataset<Row> newfilenameavgpeaks = ...

for( String col : newfilenameavgpeaks.columns()) {
    newfilenameavgpeaks = newfilenameavgpeaks
            .withColumnRenamed(col, col.replace('.', '_'));
}

VectorAssembler assemblerexp = new VectorAssembler()
    .setInputCols(newfilenameavgpeaks.columns()).setOutputCol("intensity");

Dataset<Row> filenameoutput = assemblerexp.transform(newfilenameavgpeaks);