如何使用Spark更改所有数据集中的非数值?

时间:2019-04-15 16:03:00

标签: java loops apache-spark col

我正在使用一个包含许多列的数据集,该数据集具有吗?在所有数据集中。我想用Spark(Java)来更改?到0。到目前为止,我只能用一列来做到这一点,但我想在任何地方都可以做:

    Dataset<Row> csvData = spark.read()
            .option("header", false)
            .option("inferSchema", true)
            .option("maxColumns", 50000)
            .csv("src/main/resources/K9.data");

    csvData = csvData.withColumn("_c5409", when(col("_c5409").isNull(),0).otherwise(col("_c5409")) )
        .withColumn("_c0", when(col("_c0").equalTo("?"),0).otherwise(col("_c0")) );

也许这是一个简单的解决方案,我是Java和Spark的新手:)

1 个答案:

答案 0 :(得分:1)

您可以使用when创建列列表,如果需要处理复杂的if和else情况,则可以在select中使用它

List<org.apache.spark.sql.Column> list = new ArrayList<org.apache.spark.sql.Column>();
for( String col : csvData.columns()){
    list.add(when(csvData.col(col).isNull(),0).otherwise(csvData.col(col)).alias(col));
}
csvData = csvData.select(list.toArray(new org.apache.spark.sql.Column[0]));

如果只是替换空值,这已经足够了

csvData = csvData.na().fill(0, df.columns());