首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将我的JsonObject (com.google.gson.JsonObject)转换为GenericRecord (org.apache.avro.generic.GenericRecord)类型

如何将我的JsonObject (com.google.gson.JsonObject)转换为GenericRecord (org.apache.avro.generic.GenericRecord)类型
EN

Stack Overflow用户
提问于 2018-12-29 02:46:58
回答 1查看 1.6K关注 0票数 2

我们正在创建一个数据流管道,它将获得一个JSON并写入一个parquet文件。我们使用org.apache.beam.sdk.io.parquet包来编写文件。ParquetIO.Sink允许您将PCollection of GenericRecord写入Parquet文件(从这里开始,https://beam.apache.org/releases/javadoc/2.5.0/org/apache/beam/sdk/io/parquet/ParquetIO.html)。现在我们要知道如何将JsonObject (具有复杂结构)转换为GenericRecord。

我们尝试使用(org.apache.avro.generic.GenericRecordBuilder).生成GenericRecord。我们使用的是来自JsonObject的com.google.gson.JsonObject,但是我们被困住了如何转换为带有对象的JsonArray生成GenericRecord

我们的样本Json

代码语言:javascript
运行
复制
{
    "event_name": "added_to_cart",
    "event_id": "AMKL9877",
    "attributes": [
        {"key": "total", "value": "8982", "type": "double"},
        {"key": "order_id", "value": "AKM1011", "type": "string"}
    ]
}

我们的模式

代码语言:javascript
运行
复制
{  
    "type":"record",
    "name":"event",
    "fields":[  
        {  
        "name":"event_name",
        "type":"string"
        },
        {  
        "name":"event_id",
        "type":"string"
        },
        {  
        "name":"attributes",
        "type":{  
            "type":"array",
            "items":{  
            "type":"record",
            "name":"attribute_data",
            "fields":[  
                {  
                "name":"key",
                "type":"string"
                },
                {  
                "name":"value",
                "type":"string"
                },
                {  
                "name":"type",
                "type":"string"
                }
            ]
            }
        }
        }
    ]
}

我们的代码用于使用JsonObject将GenericRecord转换为GenericRecordBuilder

代码语言:javascript
运行
复制
JsonObject event = element.getAsJsonObject();
GenericRecordBuilder recordBuilder = new GenericRecordBuilder(SCHEMA);

for (Schema.Field field:SCHEMA.getFields()) {
    System.out.println(field);
    String at_header = field.getProp(FIELD_AT_HEADER_PROPERTY);
    System.out.println(at_header);
    if(at_header != null && at_header.equals(Boolean.TRUE.toString())){
        recordBuilder.set(field.name(), null);
    }else{
        JsonElement keyElement = event.get(field.name());
        recordBuilder.set(field.name(), getElementAsType(field.schema(), keyElement));
    }
}

return recordBuilder.build();


Object getElementAsType(Schema schema, JsonElement element) { 
    if(element == null || element.isJsonNull())
        return null;
    switch(schema.getType()){
    case BOOLEAN:
        return element.getAsBoolean();
    case DOUBLE:
        return element.getAsDouble();
    case FLOAT:
        return element.getAsFloat();
    case INT:
        return element.getAsInt();
    case LONG:
        return element.getAsLong();
    case NULL:
        return null;
    case ARRAY:
        ???
    case MAP:
        ???            
    default:
        return element.getAsString();
}

我们需要知道如何为复杂类型构建GenericRecord,比如从JSON映射的对象数组。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-28 07:55:12

在这里,我找到了我的答案,从这页https://avro.apache.org/docs/1.8.2/api/java/org/apache/avro/generic/package-summary.html

Avro数据的泛型表示形式。

这种表示形式最适合处理动态数据的应用程序,这些应用程序的模式直到运行时才知道。

Avro模式映射到Java类型,如下所示:

  • 模式记录被实现为
  • 模式GenericEnumSymbol. 枚举被实现为
  • 架构数组被实现为Collection
  • 模式映射被实现为Map
  • 模式GenericFixed. 固定被实现为
  • 架构CharSequence. 字符串被实现为
  • 架构字节被实现为ByteBuffer
  • 架构ints被实现为整数
  • 架构Long s实现为Long
  • 模式浮点数被实现为Float
  • 模式加倍被实现为Double
  • 模式booleans被实现为Boolean
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53966290

复制
相关文章

相似问题

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