首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换Spark dataframe中列名的特殊字符

替换Spark dataframe中列名的特殊字符
EN

Stack Overflow用户
提问于 2018-06-29 08:50:47
回答 5查看 25.3K关注 0票数 3

我的输入spark-dataframe名为df

代码语言:javascript
复制
+---------------+----------------+-----------------------+
|Main_CustomerID|126+ Concentrate|2.5 Ethylhexyl_Acrylate|
+---------------+----------------+-----------------------+
|         725153|             3.0|                    2.0|
|         873008|             4.0|                    1.0|
|         625109|             1.0|                    0.0|
+---------------+----------------+-----------------------+

我需要从df的列名中删除特殊字符,如下所示,

  • 删除+
  • 将空间替换为underscore
  • dot替换为underscore

所以我的df应该是

代码语言:javascript
复制
+---------------+---------------+-----------------------+
|Main_CustomerID|126_Concentrate|2_5_Ethylhexyl_Acrylate|
+---------------+---------------+-----------------------+
|         725153|            3.0|                    2.0|
|         873008|            4.0|                    1.0|
|         625109|            1.0|                    0.0|
+---------------+---------------+-----------------------+

我用Scala实现了这一点

代码语言:javascript
复制
var tableWithColumnsRenamed = df

for (field <- tableWithColumnsRenamed.columns) {
      tableWithColumnsRenamed = tableWithColumnsRenamed
        .withColumnRenamed(field, field.replaceAll("\\.", "_"))
    }
for (field <- tableWithColumnsRenamed.columns) {
      tableWithColumnsRenamed = tableWithColumnsRenamed
        .withColumnRenamed(field, field.replaceAll("\\+", ""))
    }
for (field <- tableWithColumnsRenamed.columns) {
      tableWithColumnsRenamed = tableWithColumnsRenamed
        .withColumnRenamed(field, field.replaceAll(" ", "_"))
    }

df = tableWithColumnsRenamed

当我用,

代码语言:javascript
复制
for (field <- tableWithColumnsRenamed.columns) {
      tableWithColumnsRenamed = tableWithColumnsRenamed
        .withColumnRenamed(field, field.replaceAll("\\.", "_"))
    .withColumnRenamed(field, field.replaceAll("\\+", ""))
    .withColumnRenamed(field, field.replaceAll(" ", "_"))
    }

我得到的第一个列名为126 Concentrate,而不是126_Concentrate

但是我不喜欢这个替换的3 for循环。我能找到解决办法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-06-29 09:32:50

代码语言:javascript
复制
df
  .columns
  .foldLeft(df){(newdf, colname) =>
    newdf.withColumnRenamed(colname, colname.replace(" ", "_").replace(".", "_"))
  }
  .show
票数 11
EN

Stack Overflow用户

发布于 2018-06-29 09:42:53

您可以使用withColumnRenamed regex replaceAllInfoldLeft,如下所示

代码语言:javascript
复制
val columns = df.columns

val regex = """[+._, ]+"""
val replacingColumns = columns.map(regex.r.replaceAllIn(_, "_"))

val resultDF = replacingColumns.zip(columns).foldLeft(df){(tempdf, name) => tempdf.withColumnRenamed(name._2, name._1)}

resultDF.show(false)

这应该会给你

代码语言:javascript
复制
+---------------+---------------+-----------------------+
|Main_CustomerID|126_Concentrate|2_5_Ethylhexyl_Acrylate|
+---------------+---------------+-----------------------+
|725153         |3.0            |2.0                    |
|873008         |4.0            |1.0                    |
|625109         |1.0            |0.0                    |
+---------------+---------------+-----------------------+

我希望答案是有帮助的。

票数 8
EN

Stack Overflow用户

发布于 2019-10-04 07:21:14

在java中,您可以使用df.columns()迭代列名,并用string replaceAll(regexPattern, IntendedCharreplacement)替换每个头字符串。

然后使用withColumnRenamed(headerName, correctedHeaderName)重命名df头。

伊格-

代码语言:javascript
复制
for (String headerName : dataset.columns()) {
    String correctedHeaderName = headerName.replaceAll(" ","_").replaceAll("+","_");
    dataset = dataset.withColumnRenamed(headerName, correctedHeaderName);
}
dataset.show();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51097818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档