【发布时间】: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