使用 SparkSQL 以编程方式将空值/未定义值/未知值替换为最常见的值



我在 Spark 应用程序中有一个数据集具有以下形状:

some_id     class       city
1           A           ROME
1           A           undefined
1           A           ROME
1           null        ROME
2           B           MILAN
2           B           unkown
2           B           MILAN
2           unknown     MILAN
3           C           PALERMO
3           C           PALERMO
3           C           null
3           null        PALERMO

生成的数据集应如下所示:

some_id     class       city
1           A           ROME
1           A           ROME
1           A           ROME
1           A           ROME
2           B           MILAN
2           B           MILAN
2           B           MILAN
2           B           MILAN
3           C           PALERMO
3           C           PALERMO
3           C           PALERMO
3           C           PALERMO

我尝试了基本的循环方式,但我发现它不实用,最好的方法是什么?

这是我尝试做的:

String[] columnsNames = {"class", "city"};
for (String columnName : columnsNames)  {
Dataset<Row> grouped = mydataset.groupBy(col("some_id"), col(columnName)).agg(functions.count("*").alias("itemCount"));
grouped = grouped
.where(not(col(columnName).equalTo("null")))
.groupBy(col("some_id"))
.agg(functions.max(col("itemCount")))
;
grouped.show();
...etc    
}

如果id = 1始终与A类和罗马城市相关联,则您有两种选择:修改输入文件或使用Spark(数据集(可以按ID分组,仅选择具有类和城市!=空或未知的记录,并将结果存储在新数据集中。要获得结果,您可以使用sql功能并执行以下操作:

dataset.createOrReplaceTempView("tempView");
Dataset<Row> filteredRows = session.sql("select * from tempView where some_id <> null and some_id <> unknown and city <> null and city <> uknown group by some_id")

最新更新