以编程方式使用SparkSQL将null / undefined / unknown值替换为最常用的值

时间:2018-06-25 15:13:05

标签: java apache-spark

我在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    
}

1 个答案:

答案 0 :(得分:0)

如果id始终与A类和罗马城市相关联,则有两个选择:修改输入文件或使用spark(数据集)可以按id分组,仅选择具有class andcity的记录!= null或未知并将结果存储在新的数据集中。要获得结果,您可以使用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")