java - 使用 Java API 对数据集中所有列进行数据操作

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

读取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[]并且无法对Dataset执行函数式编程。

输入数据

+----------------+----------+-----+---+---+
|               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|
+--------------+---------+-----+---+---+

最佳答案

尝试:

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

关于java - 使用 Java API 对数据集中所有列进行数据操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38766972/

相关文章:

apache-spark - 尝试使用 Spark 处理 Hive 表时出现 "Unable to instantiate SparkSession with Hive support"错误

scala - 在 yarn 簇上使用带有管道的 addFile

apache-spark - 如果 Apache Zeppelin 0.9.0 和 Apache Spark 3.1.1 不兼容,如何运行它们?

java - 不兼容类型双字符串

java - IP 范围和端口扫描器

scala - Scala 有好的数学/统计库吗?

scala - Scala中,Future[Option[A]]如何进行类型转换?

regex - 解析 CSV 字符串,同时忽略各个列内的逗号

java - 无法在java中移动对象

java - 设置由 Activity 链接的新页面