首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Avro文件映射到具有不同字段名称的Java类上

将Avro文件映射到具有不同字段名称的Java类上
EN

Stack Overflow用户
提问于 2018-01-29 15:42:52
回答 2查看 497关注 0票数 4

我有一个简单的spark任务的问题,它读取Avro文件,然后将其保存为蜂巢镶嵌板表格。

我有两种类型的文件,大体上是一样的,但是关键的结构有点不同--字段名。

类型1

代码语言:javascript
复制
root
|-- pk: strucnt (nullable = true)
    |-- term_id: string (nullale = true)

类型2

代码语言:javascript
复制
root
|-- pk: strucnt (nullable = true)
    |-- id: string (nullale = true)

我正在用spark-avro阅读Avro。然后将此DF映射到bean,如下所示

代码语言:javascript
复制
Dataset<SomeClass> df = avroDF.as(Encoders.bean(SomeClass.class));

SomeClass是一个简单的单字段类,带有getter和setter。

代码语言:javascript
复制
public class SomeClass{
    private String term_id;
    ...
}

所以如果我读的是Avro类型1-没问题。但是如果我读的是Avro类型2--错误就发生了。如果我将字段名更改为private String id;,反之亦然

我的问题有没有通用的解决方案?我找到了@AvroName,但它不允许设置多个名称。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-29 21:16:16

可能的解决方案是

代码语言:javascript
复制
StructType avroExtendedSchema = avroDF.schema().add("id",DataTypes.StringType);
avroDF.map(row->RowFactory(row.getStruct(0),row.getStruct(0).getString(0)), 
       RowEncoder.apply(avroExtendedSchema)).toDF();

因此,DF的第二个字段将被命名为"id“,并包含字符串key。第一个"pk“结构可以在将来删除。

代码语言:javascript
复制
avroDF.drop("pk");

PS我发现了第三种类型的模式:

代码语言:javascript
复制
root
|-- pk: strucnt (nullable = true)
    |-- id: int(nullale = true)

因此,最终的代码如下:

代码语言:javascript
复制
DataType keyType = avroDF.select("pk.*").schema().fields[0].dataType();
StructType avroExtendedSchema = avroDF.schema().add("id",keyType);
avroDF.map(row->RowFactory(row.getStruct(0),row.getStruct(0).get(0)), 
       RowEncoder.apply(avroExtendedSchema)).drop("pk").toDF();

此代码适用于任何原始字符串键。

票数 1
EN

Stack Overflow用户

发布于 2018-01-29 16:55:46

只有一种方法是将dataset fieldname更改为架构中的名称。请使用此示例来完成此操作:

代码语言:javascript
复制
val newName = Seq("id", "x1", "x2", "x3")
Dataset<SomeClass> df = avroDF.toDF(newNames: _*).as(Encoders.bean(SomeClass.class));

您不能将dataframe转换为具有不同字段名的BeanClass。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48496550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档