【问题标题】:How to replace null values with a specific value in Dataframe using spark in Java?java - 如何使用Java中的spark将空值替换为Dataframe中的特定值?
【发布时间】:2017-06-21 18:38:26
【问题描述】:

我正在尝试提高使用 Java 在 Spark 中实现的逻辑回归算法的准确性。为此,我试图用该列中最常见的值替换列中存在的 Null 或无效值。例如:-

Name|Place
a   |a1
a   |a2
a   |a2
    |d1
b   |a2
c   |a2
c   |
    |
d   |c1

在这种情况下,我会将“名称”列中的所有 NULL 值替换为“a”,并将“位置”列中的所有 NULL 值替换为“a2”。到目前为止,我只能提取特定列中最常见的列。您能否帮我完成第二步,如何将空值或无效值替换为该列中最常见的值。

【问题讨论】:

    标签: java apache-spark


    【解决方案1】:

    您可以使用.na.fill函数(它是org.apache.spark.sql.DataFrameNaFunctions中的函数)。

    基本上你需要的函数是:def fill(value: String, cols: Seq[String]): DataFrame

    您可以选择列,然后选择要替换 null 或 NaN 的值。

    在你的情况下,它会是这样的:

    val df2 = df.na.fill("a", Seq("Name"))
                .na.fill("a2", Seq("Place"))
    

    【讨论】:

    • 它在 Java 中可用吗?我找不到类似的填充功能。
    • 对不起,我没有在 Java 中使用它,但是您可以在此处找到 Spark 的最新版本文档,并且您可以在此处看到 DataFrameNaFunctions:spark.apache.org/docs/latest/api/java/index.html 可能尝试不使用 .na 进行填充
    • @PirateJack 如果它解决了你的问题,你能接受答案吗?
    • 尝试过将它与null 一起使用? .它说cannot be applied to (Null, Int)。它没有解决我的目的。所以想知道2年后现在可能有一些解决方案:)
    【解决方案2】:

    您需要使用数据框的 fill(String value, String[] columns) 方法,该方法会自动将给定列列表中的 Null 值替换为您指定的值。

    因此,如果您已经知道要将 Null 替换为...的值:

    String[] colNames = {"Name"}
    dataframe = dataframe.na.fill("a", colNames)
    

    您可以对其余列执行相同操作。

    【讨论】:

    • 我的数据框属于 Dataset 类型。它说它没有为类型 Dataset 定义
    • 我已更新我的答案以包含 .na 部分。你也可以试试:df.na.fill(ImmutableMap.of("ColumnName", "replacementValue", "egName", "egA");
    • 非常感谢您的帮助。我能够使用 scala 序列库来实现它。我会在我的答案中更新相同的内容。
    【解决方案3】:

    您可以使用DataFrame.na.fill() 将空值替换为某个值 要立即更新,您可以这样做

    val map = Map("Name" -> "a", "Place" -> "a2")
    
    df.na.fill(map).show()
    

    但是如果您也想替换坏记录,那么您需要先验证坏记录。您可以通过使用带有like 函数的正则表达式来做到这一点。

    【讨论】:

    • 我需要单独为每一列而不是一次整个数据框。您能否分享一个示例,说明我将如何替换任何值。另外,我将为不良记录创建一个正则表达式。如果有,请分享 java 示例。谢谢。
    • 我们可以根据条件来执行此操作吗 -> 仅当 col1 不为空时才填充 column2?
    【解决方案4】:

    为了用给定的字符串替换 NULL 值,我使用了 Spark for Java 中的 fill 函数。它接受要替换的单词和一系列列名。以下是我的实现方式:-

    List<String> colList = new ArrayList<String>();
    colList.add(cols[i]);
    Seq<String> colSeq = scala.collection.JavaConverters.asScalaIteratorConverter(colList.iterator()).asScala().toSeq();
    data=data.na().fill(word, colSeq);
    

    【讨论】:

      猜你喜欢
      • 2016-01-27
      • 2017-10-21
      • 2022-01-08
      • 1970-01-01
      • 2017-08-14
      • 2018-08-26
      • 2019-06-22
      • 1970-01-01
      • 2022-11-20
      相关资源
      最近更新 更多