【问题标题】:Data manipulation on all columns in Dataset with Java API使用 Java API 对 Dataset 中的所有列进行数据操作
【发布时间】:2016-12-10 13:19:25
【问题描述】:

读取Dataset中的csv文件后,想用Java API去除String类型数据中的空格。

Apache Spark 2.0.0

Dataset<Row> dataset = sparkSession.read().format("csv").option("header", "true").load("/pathToCsv/data.csv");
Dataset<String> dataset2 = dataset.map(new MapFunction<Row,String>() {

    @Override
    public String call(Row value) throws Exception {

        return value.getString(0).replace(" ", ""); 
        // But this will remove space from only first column
    }
}, Encoders.STRING());

通过使用MapFunction,无法从所有列中删除空格。

但在Scala 中,通过在spark-shell 中使用以下方式可以执行所需的操作。

val ds = spark.read.format("csv").option("header", "true").load("/pathToCsv/data.csv")
val opds = ds.select(ds.columns.map(c => regexp_replace(col(c), " ", "").alias(c)): _*)

数据集opds 包含没有空格的数据。想在 Java 中实现相同的目标。但是在 Java API 中 columns 方法返回 String[] 并且无法对数据集执行函数式编程。

输入数据

+----------------+----------+-----+---+---+
|               x|         y|    z|  a|  b|
+----------------+----------+-----+---+---+
|     Hello World|John Smith|There|  1|2.3|
|Welcome to world| Bob Alice|Where|  5|3.6|
+----------------+----------+-----+---+---+

预期输出数据

+--------------+---------+-----+---+---+
|             x|        y|    z|  a|  b|
+--------------+---------+-----+---+---+
|    HelloWorld|JohnSmith|There|  1|2.3|
|Welcometoworld| BobAlice|Where|  5|3.6|
+--------------+---------+-----+---+---+

【问题讨论】:

  • 您要在哪个位置删除空格,发布一个示例字符串并输出您所期望的。您可以使用 trim() 函数删除前导和尾随空格。
  • @Ravikumar 想要删除字符串之间的空格。
  • 您可以使用正则表达式来删除字符串之间的空格,只需发布​​一个示例字符串以及删除空格后您期望的输出字符串。
  • @Ravikumar 检查已编辑的问题

标签: java scala apache-spark apache-spark-sql


【解决方案1】:

试试:

for (String col: dataset.columns) {
  dataset = dataset.withColumn(col, regexp_replace(dataset.col(col), " ", ""));
}

【讨论】:

    【解决方案2】:

    您可以尝试使用正则表达式来删除字符串之间的空格。

    value.getString(0).replaceAll("\\s+", "");
    

    关于 \s+ :匹配任何一次到无限次之间的空白字符,尽可能多次。 使用 replaceAll 函数代替替换。

    更多关于replace和replaceAll函数Difference between String replace() and replaceAll()

    【讨论】:

    • 这将只删除第一列的空格。
    • 打印出value.getString(0)并贴出来看看字符串是否是多行的。
    • @mastersheel007 试试这个value.getString(0).replaceAll("(?is)\\s+", "");
    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 2021-11-19
    • 2012-08-19
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多