如何使用 Spark 更改所有数据集中的非数值?
How can I change a non numeric value in all the data set using Spark?
我正在使用一个包含很多列的数据集,这个数据集有 ?在所有的数据集中。我想 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 的新手:)
您可以使用 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]));
如果只是单纯的替换null,这样就够了
csvData = csvData.na().fill(0, df.columns());
我正在使用一个包含很多列的数据集,这个数据集有 ?在所有的数据集中。我想 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 的新手:)
您可以使用 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]));
如果只是单纯的替换null,这样就够了
csvData = csvData.na().fill(0, df.columns());