从Scala Spark数据框中的列(名称)中删除特定值(列(数字))

时间:2019-02-08 11:58:38

标签: scala apache-spark dataframe

输入数据框::

编号|名称

1 | 1 abc真棒

2 | abc 2你太棒了

58 | xyz,您太棒了58

预期的输出数据框::

编号|名称

1 | abc,您真棒

2 | abc,您很棒

58 | xyz,您很棒!

基本上想从“名称”列中删除“列号”的值。它可以在任何时间和任何地点。

3 个答案:

答案 0 :(得分:0)

您可以使用子字符串。

例如。您的abc 1列可能是:

yourdataframename.withColumn("your_new_column_name" , substring($"abc_1_column_name" , 1, 3)).drop("abc_1_column_name")

答案 1 :(得分:0)

您的示例看起来像您正在尝试映射数据框的值,但是如果您确实如您所说的“想要从列名中删除列号的值”,那么您可以遍历所有列并重命名每个列因此(在Java中):

for (String col : df.columns()) {
    df = df.withColumnRenamed(col, col.replaceAll("[^A-Za-z]",""));
}

如果您要从整个数据集中删除数字,则必须map每行:

String[] columns = df.columns();
df = df.map(row -> {
    String[] newValues = new String[columns.length];
    for (int i = 0; i < columns.length; i++) {
        newValues[i] = row.getString(i).replaceAll("[^A-Za-z]","");
    }
    return RowFactory.create(newValues);
}, RowEncoder.apply(df.schema()));

答案 2 :(得分:0)

您可以尝试一下,

val removeNumber=udf((s:String,n:Int)=>{s.replaceAll(n.toString, " "); })

df=df.withColumn(col("columnName"),removeNumber(col("oldColumnName"),col("firstColumn")).drop("oldColumnName")