DataFrameNaFunctions用來對DataFrame中值為null或NaN的列做處理,處理分為三種類型:
drop:根據條件丟棄含有null或NaN的行
fill:根據條件使用指定值填充值為null或NaN的列,相當於設置默認值
replace:根據條件替換列值
下面是針對每種處理方式的詳細解釋:
package cc11001100.spark.dataset.DataFrameNaFunctionsDemo;
import com.google.common.collect.ImmutableMap;
import org.apache.spark.sql.DataFrameNaFunctions;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.catalyst.encoders.RowEncoder;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import java.util.ArrayList;
import java.util.List;
/**
* DataFrameNaFunctions對空值的處理主要有三種:
* drop
* fill
* replace
*
* @author CC11001100
*/
public class DataFrameNaFunctionsDemo {
private static Integer randomValue(int n) {
if (Math.random() < 0.5) {
return n;
} else {
return null;
}
}
public static void main(String[] args) {
SparkSession spark = SparkSession.builder().master("local[*]").getOrCreate();
List<Row> rowList = new ArrayList<>();
for (int i = 0; i < 100; i++) {
Row row = RowFactory.create(randomValue(i), randomValue(i));
rowList.add(row);
}
Dataset<Row> nums = spark.createDataset(rowList, RowEncoder.apply(DataTypes.createStructType(new StructField[]{
DataTypes.createStructField("col_1", DataTypes.IntegerType, true),
DataTypes.createStructField("col_2", DataTypes.IntegerType, true),
})));
nums.show(false);
DataFrameNaFunctions dataFrameNaFunctions = nums.na();
/*----------------------------- drop -------------------------------*/
// 只要某行中有一列是null或NaN即丟掉此行數據,內部調用了drop("any")
dataFrameNaFunctions.drop().show();
// 指定丟棄行的方式,any表示行中任意一列是null或NaN即丟棄此行,all表示此行中所有列都是null或NaN才丟棄此行
dataFrameNaFunctions.drop("any").show();
// 當某行中的所有列為null或NaN時丟棄掉此行
dataFrameNaFunctions.drop("all").show();
// 當某行的指定列為null或any時丟棄掉此行
dataFrameNaFunctions.drop(new String[]{"col_1", "col_2"}).show();
// 當某行的指定列任意一個為null或NaN時丟棄掉此行
dataFrameNaFunctions.drop("any", new String[]{"col_1", "col_2"}).show();
// 當某行的指定列全部為null或NaN時丟棄掉此行
dataFrameNaFunctions.drop("all", new String[]{"col_1", "col_2"}).show();
// 當某行中指定列為null或NaN的數量大於指定值時丟棄掉此行
dataFrameNaFunctions.drop(1).show();
dataFrameNaFunctions.drop(1, new String[]{"col_1", "col_2"}).show();
/*----------------------------- fill -------------------------------*/
// 使用指定的值填充所有為null或NaN的列s,相當於為所有null或NaN設置默認值
dataFrameNaFunctions.fill(1L).show();
dataFrameNaFunctions.fill(0.1).show();
dataFrameNaFunctions.fill("").show();
dataFrameNaFunctions.fill(true).show();
// 當給定的列出現null或NaN值時使用對應值填充,相當於為指定的列設置默認值
dataFrameNaFunctions.fill(1L, new String[]{"col_1, col_2"}).show();
dataFrameNaFunctions.fill(0.1, new String[]{"col_1, col_2"}).show();
dataFrameNaFunctions.fill("", new String[]{"col_1, col_2"}).show();
dataFrameNaFunctions.fill(true, new String[]{"col_1, col_2"}).show();
// 傳入Map可以為每一列設置不同的值,map的key為列名,值為當key列為null或NaN時要填充的值
// 要填充的值必須是下列類型之一: `Integer`, `Long`, `Float`, `Double`, `String`, `Boolean`.
dataFrameNaFunctions.fill(ImmutableMap.of("col_1", "unknown", "col_2", 1.0)).show();
/*----------------------------- replace -------------------------------*/
// 當指定列的值為key時,將其替換為value
dataFrameNaFunctions.replace("col_1", ImmutableMap.of("UNKNOWN", "unnamed")).show();
dataFrameNaFunctions.replace(new String[]{"col_1", "col_2"}, ImmutableMap.of("UNKNOWN", "unnamed")).show();
}
}
相關資料:
1. Class DataFrameNaFunctions - spark doc
.
