簡體   English   中英

創建一個新的Spark數據集 <Row> 基於現有數據集 <Row> 和一個附加的HashMap

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM