当前位置: 首页 > 知识库问答 >
问题:

在java spark中更新struct type列中的值

刘焱
2023-03-14

我希望能够更新嵌套数据集中的值。为此,我在Spark中创建了一个嵌套数据集。它有以下模式结构:-

root

 |-- field_a: string (nullable = false)

 |-- field_b: struct (nullable = true)

 |    |-- field_d: struct(nullable = false)
          |-- field_not_to_update: string(nullable = true)

 |        |-- field_to_update: string(nullable = false)
 |   field_c: string (nullable = false)

现在我想更新数据集中field_to_update中的值

aFooData.withColumn("field_b.field_d.field_to_update", lit("updated_val")

也试过,

aFooData.foreach(new ClassWithForEachFunction());

实现ForEach函数的方法

到目前为止,它们都没有取得任何成果,在第二种情况下,我使用foreach获得了相同的数据集,并使用名为field_b.field_d.field_to_update的新列。还有其他类似的建议吗?

共有3个答案

沈博延
2023-03-14

更“类似Java”的方法是将数据帧转换为(类型化的)数据集,然后使用映射调用来更改数据。从Java的角度来看,代码很容易处理。但缺点是,对于给定的模式,您需要三个JavaBean类。

Dataset<Bean1> ds = df.as(Encoders.bean(Bean1.class));

Dataset<Bean1> updatedDs = ds.map((MapFunction<Bean1, Bean1>) row -> {
    row.getField_b().getField_d().setField_to_update("updated");
    return row;
}, Encoders.bean(Bean1.class));

三个Bean类

public static class Bean1 implements Serializable {
    private String field_a;
    private Bean2 field_b;
    private String field_c;

    //getters and setters
}

public static class Bean2 implements Serializable {
    private Bean3 field_d;

    //getter and setter
}

public static class Bean3 implements Serializable {
    private String field_not_to_update;
    private String field_to_update;

    //getters and setters
}
裴嘉许
2023-03-14

你必须重建整个模式,你可以用下面的句子在一个实例中完成。

import org.apache.spark.sql.functions.{lit, struct}

df.select(
  df("field_a"), // keep the fields that don't change
  struct( // the field at first level must be reconstructed
     lit("updated_value") as "field_to_update", // transform or set the new elements
     df("fb.field_not_to_update") as "field_not_to_update" // keep the unchanged sub elements and keep the last name
  ) as "field_b", // and we have to keep the name
  df("field_c")
)

java中,语法将是相同的

曹新觉
2023-03-14

请检查下面的代码。

  • 从struct中提取字段
  • 更新所需的文件
  • 重建结构
scala> df.show(false)
+-------+--------------+
|field_a|field_b       |
+-------+--------------+
|parentA|[srinivas, 20]|
|parentB|[ravi, 30]    |
+-------+--------------+


scala> df.printSchema
root
 |-- field_a: string (nullable = true)
 |-- field_b: struct (nullable = true)
 |    |-- field_to_update: string (nullable = true)
 |    |-- field_not_to_update: integer (nullable = true)


scala> df.select("field_a","field_b.field_to_update","field_b.field_not_to_update").withColumn("field_to_update",lit("updated_val")).select(col("field_a"),struct(col("field_to_update"),col("field_not_to_update")).as("field_b")).show(false)
+-------+-----------------+
|field_a|field_b          |
+-------+-----------------+
|parentA|[updated_val, 20]|
|parentB|[updated_val, 30]|
+-------+-----------------+

 类似资料:
  • 我需要更新名为“值”列的一些信息: 如果家有价值124,我想增加到价值0.5。我正在考虑使用. loc来选择行,但我需要了解如何更新值。我预期的结果应该是 任何提示都很感激。

  • 看看新的spark dataframe api,不清楚是否可以修改dataframe列。 如何更改DataFrame的行列中的值? 如果要对列执行某些操作并创建添加到DataFrame的新列: 如果希望新列的名称与旧列相同,可以添加附加步骤:

  • 本文向大家介绍在SAP系统中更新新列的默认值,包括了在SAP系统中更新新列的默认值的使用技巧和注意事项,需要的朋友参考一下 将默认值更新为一列不是一个好习惯,因为它将在系统中直接不可见,也不会被CTS选中。同样,在SAP / ABAP环境中,没有选择向表列添加默认值的选项。如果选择使新列具有NON-NULL值,则必须手动更新默认值,并且将花费大量时间来修改表。最好的方法是根据列的类型将默认值选择为

  • {“traffic\u fource”:“{name':'intgreints',medium':'(none)',source':'(direct)}}” 这是一个拼花文件,它有json格式的数据,但值部分在双引号中,这使它成为一个字符串而不是StructType,我想不知道它在诸如traffic\u fource\u name和value等列之间有“_”将是int,然后traffic\u fo

  • 如何将一个新的列事件添加到数据帧中,该事件将是< code>generate_header的结果?如何添加一行作为列值? 可能我们需要将函数转换为UDF 假设我们有这样的东西 我们想得到这个

  • 问题内容: 查看新的spark数据框api,尚不清楚是否可以修改数据框列。 我怎么会去改变行的值列一个数据帧的? 在这将是 编辑:合并以下内容,您不能修改现有数据框,因为它是不可变的,但是您可以返回具有所需修改的新数据框。 如果您只想根据条件替换列中的值,例如: 如果要对列执行某些操作并创建一个添加到数据框的新列: 如果希望新列的名称与旧列的名称相同,则可以添加其他步骤: 问题答案: 虽然您不能这