【问题标题】:Fill null values with empty string in Dataset<Row> using Apache-Spark in java在 java 中使用 Apache-Spark 在 Dataset<Row> 中用空字符串填充空值
【发布时间】:2019-05-06 13:04:48
【问题描述】:

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

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

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

但它不会删除空值。我无法理解可能是什么原因。

|-- stopPrice: double (nullable = true) |-- tradingCurrency: string (nullable = true)

【问题讨论】:

  • 您能否提供您的 CSV 样本(“它不工作”的行)、您获得的输出以及您期望的输出?这真的可以帮助我们了解问题所在。
  • 只是让您知道,我尝试了您的代码并且它有效。很可能,您的值并不是真的为空,但我需要更多信息才能确定。
  • 刚刚更新了我的问题。我正在阅读两个文件,一个是镶木地板,一个是 csv。两者都包含相似的数据。我将两者都存储到数据集(Dataset)。然后我使用上面的代码用空字符串替换空值。对于从 csv 创建的数据集,它正在工作,对于从 parquet 创建的数据集,它不工作
  • 我试过 Dataset ds1 = ds.na().fill(0);它正在工作。此填充方法是否取决于列的数据类型?如果是,那么我需要先将此列转换为字符串。那会很乱。有什么干净的方法吗?
  • 我已经开始用一个例子写一个答案。无论如何,我发布了它,它可以帮助其他人。关于您的下一个问题,您可以在使用spark.read.schema(...).csv("xxx.csv") 从 CSV 文件中读取数据框时应用架构。但是,如果数据框已经创建,则需要转换相应的列。在您的情况下,您可能可以读取 parquet 文件,使用 df.schema() 提取架构并在解析 CSV 时使用它。

标签: java apache-spark


【解决方案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 转换为字符串并使代码正常工作。在您的情况下,这可能是一个很好的解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2020-10-21
    • 2017-11-17
    • 2021-05-20
    • 2013-09-16
    • 2011-12-07
    • 1970-01-01
    相关资源
    最近更新 更多