我希望能够更新嵌套数据集中的值。为此,我在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
的新列。还有其他类似的建议吗?
更“类似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
}
你必须重建整个模式,你可以用下面的句子在一个实例中完成。
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中,语法将是相同的
请检查下面的代码。
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,尚不清楚是否可以修改数据框列。 我怎么会去改变行的值列一个数据帧的? 在这将是 编辑:合并以下内容,您不能修改现有数据框,因为它是不可变的,但是您可以返回具有所需修改的新数据框。 如果您只想根据条件替换列中的值,例如: 如果要对列执行某些操作并创建一个添加到数据框的新列: 如果希望新列的名称与旧列的名称相同,则可以添加其他步骤: 问题答案: 虽然您不能这