kotlin 如何读取/更新嵌套Avro通用记录中的值?

k7fdbhmy  于 2023-08-06  发布在  Kotlin
关注(0)|答案(2)|浏览(87)

我尝试使用Apache Beam Pardo访问Avro Generic Record中的嵌套字段。
我可以进入第一层,但我不知道如何访问更远的字段。
如果你像这样考虑Generic Record值:

{
    "eventTargetType": "GROUP",
    "id": "1234",
    "group":
    {
        "details":
        {
           
            "triggers":
            [],
            "attributes":
            []
        },
        "groupRole":
        {
            "algorithmResults":
            []
        },
        "activeTests":
        []
    }
}

字符串
我可以通过这样做来达到小组水平:

@ProcessElement
fun processElement(input: ProcessContext, output: OutputReceiver<GenericRecord>) {
    input.element().getAsGenericRecord("event").get("group")
}


这将返回数据类型为(org.apache.avro.generic.GenericData$Record)的值:

{
    "event": "RENDER",
    "details":
    {
        "ow": null,
        "ty": null,
        "na": null,
        "attributes":[],
    },
    "loc": null,
    "pos": null
}


现在我想得到details内部的字段attributes。我不能做另一个get(),因为它不允许。我该怎么做呢?

mec1mxoz

mec1mxoz1#

不太熟悉Pardo,但我很确定你必须手动将返回类型转换为Map或GenericRecord

((Map)((Map) input.element().getAsGenericRecord("event").get("group")).get("details")).get("owner")

字符串

uurity8g

uurity8g2#

我可以通过三种方法来实现这一点。
第一种方法是将Avro Generic Record转换为JsonObject,然后访问嵌套字段

val jsonObj = JSONObject(newElement.getAsGenericRecord("event")?.get("group").toString())
val bannerJsonObject = jsonObj.getJSONObject("details").getJSONObject("nested")
if (bannerJsonObject.get("abc").toString() == "null"){
    bannerJsonObject.put("abc","dummy")
}

字符串
第二种方法是将值转换为Generic Record

val dataNestedObjGroup = newElement.getAsGenericRecord("event")?.get("group") as GenericRecord
val dataNestedObjDetails = dataNestedObjGroup.getAsGenericRecord("details")?.get("nested") as GenericRecord

if (dataNestedObjDetails.get("abc") == null){
    dataNestedObjDetails.put("abc","dummy")
}


第三种方法是在嵌套级别中导航:

val event = newElement.getAsGenericRecord("event")
val group = event?.getAsGenericRecord("group")
val details = group?.getAsGenericRecord("details")
val nested = details?.getAsGenericRecord("nested")

if (nested?.get("abc") == null){
    nested?.put("abc","dummy")
}

相关问题