使用Java中的Apache-Spark在Dataset <row>中用空字符串填充空值

时间:2019-05-06 13:04:48

标签: java apache-spark

请不要将此问题标记为重复。我已经检查了以下问题,它为python或scala提供了解决方案。而且对于java方法是不同的。 How to replace null values with a specific value in Dataframe using spark in Java?

我有一个数据集Dataset<Row> ds,该数据集是通过读取镶木地板文件创建的。因此,所有列值都是字符串。一些值是空的。我正在使用.na()。fill(“”)用空字符串替换空值

Dataset<Row>  ds1 = ds.na().fill("");

但是它没有删除空值。我不明白是什么原因。

|-stopPrice:双精度(nullable = true)  |-tradingCurrency:字符串(nullable = true)

1 个答案:

答案 0 :(得分:1)

据我所见,您的列具有数字类型。同样,您不能在Spark中用无效值替换空值。因此,在您的情况下,不能使用字符串(在您的情况下为“”)。这是一个说明这一点的示例:

Dataset<Row> df = spark.range(10)
    .select(col("id"),
             when(col("id").mod(2).equalTo(lit(0)), null )
                 .otherwise(col("id").cast("string")).as("string_col"),
             when(col("id").mod(2).equalTo(lit(0)), null )
                 .otherwise(col("id")).as("int_col"));

df.na().fill("").show();

这是结果

+---+----------+-------+
| id|string_col|int_col|
+---+----------+-------+
|  0|          |   null|
|  1|         1|      1|
|  2|          |   null|
|  3|         3|      3|
|  4|          |   null|
|  5|         5|      5|
|  6|          |   null|
|  7|         7|      7|
|  8|          |   null|
|  9|         9|      9|
+---+----------+-------+

它适用于字符串,但不适用于整数。请注意,我使用了cast函数将一个int转换为字符串并使代码正常工作。在您遇到的情况下,这可能是一个不错的解决方法。