火花行编码器:空元数据

Posted

技术标签:

【中文标题】火花行编码器:空元数据【英文标题】:Spark row encoder: empty metadata 【发布时间】:2020-05-13 19:56:01 【问题描述】:

我在 Java 中使用 spark,我正在从 RDD OF 行创建一个数据集。

我使用创建架构

Metadata meta = new MetadataBuilder().putString("type", "categorical").build();
StructField s = new StructField(name, IntegerType, true, meta);
StructType t = new StructType(new StructField[]s);  
Encoder<Row> encoder = RowEncoder.apply(t);

我像这样在数据集中使用它

ds.flatMap((FlatMapFunction<Row, Row>) this::customFlatMapRow, encoder);

由于某些原因,在我编写表并检查架构的字段及其元数据之后,它们是空的(尽管我创建并设置它们的事实如上所示)。不知怎的,我失去了他们

【问题讨论】:

【参考方案1】:

如果您检查数据集的ExpressionEncoder,则元数据可用。

代码

Metadata meta = new MetadataBuilder().putString("type", "categorical").build();
StructField s = new StructField("col", IntegerType, true, meta);
StructType t = new StructType(new StructField[]s);
Encoder<Row> encoder = RowEncoder.apply(t);

Dataset<Row> df = spark.createDataset(Arrays.asList(1, 2, 3), Encoders.INT()).toDF("col");
Dataset<Row> df2 = df.flatMap((FlatMapFunction<Row, Row>) r -> Collections.singleton(r).iterator(), encoder);
System.out.println(df2.exprEnc().schema().fields()[0].metadata());

打印

"type":"categorical"

【讨论】:

以上是关于火花行编码器:空元数据的主要内容,如果未能解决你的问题,请参考以下文章

Python数据类型 ——— 元组

如何在火花流中刷新加载的数据帧内容?

将空元组分配给专用变量时的类型不兼容

python——元组(tuple)基本操作

关于python的元组操作

根据火花数据框scala中的列值过滤行