[英]Create a new Spark Dataset<Row> based on an existing Dataset<Row> and an added HashMap
我有一個基於JSON數據的Dataset<Row>
。 現在,我想基於初始數據集BUT創建一個新的Dataset<Row>
,並添加一個基於Java HashMap<String, String>
數據類型的列,例如
Dataset<Row> dataset2 = dataset1.withColumn("newColumn", *some way to specify HashMap<String, String> as the added column's datatype*);
使用這個新的數據集,我可以創建一個行編碼器,例如
ExpressionEncoder<Row> dataset2Encoder = RowEncoder.apply(dataset2.schema());
然后應用諸如
dataset2 = dataset2.map(new XyzFunction(), dataset2Encoder)
澄清我的初始數據集基於JSON格式的數據。 我要完成的工作是基於此初始數據集BUT創建一個新數據集,並在MapFunction中添加新列。 在創建初始數據集時添加列(withColumn)的想法將確保要在MapFunction中更新的列存在模式定義。 但是,我似乎找不到一種方法來修改傳遞給MapFunction類的call(Row arg)函數的Row對象,或在調用函數中使用RowFactory.create(...)創建新實例。 我希望能夠基於傳遞的Row對象的所有現有值以及要添加到新行的新Map來在MapFunction中創建Row實例。 然后,編碼器將從生成的架構中知道此新的/生成的列。 我希望這可以澄清我要完成的工作...
您可以
import static org.apache.spark.sql.functions.*;
import org.apache.spark.sql.types.DataTypes;
df.withColumn("newColumn", lit(null).cast("map<string, string>"));
要么
df.withColumn(
"newColumn",
lit(null).cast(
DataTypes.createMapType(DataTypes.StringType, DataTypes.StringType)
)
);
但是為什么這樣的間接?
Encoder<Row> enc = RowEncoder.apply(df.schema().add(
"newColumn",
DataTypes.createMapType(DataTypes.StringType, DataTypes.StringType)
));
根據您確切嘗試執行的操作,使用UserDefinedFunction
可能會更簡單,並且可以完全跳過Encoders
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.