如何填充avro嵌套的地图结构

时间:2014-08-14 00:37:07

标签: avro

是否有人将GenericData.Record与Avro和嵌套地图记录一起使用。给出以下架构,我正在努力填充地图中的GenericData.Record

 {"name": "log_data", "type":
   [ "null",
     { "type": "map", "values":
       { "type": "record",
         "name": "TypeValuePair",
         "fields": [
           {"name": "type", "type": "string"},
           {"name": "value", "type": ["null", "string"]}
         ]
       }
     }
   ]
 }

java代码:

Schema mapSchema = schema.getField("log_data").schema().getTypes().get(1);

//The code below fails

GenericRecord typeValuePair =
    new GenericData.Record(mapSchema.getField("TypeValuePair").schema());

使用:

org.apache.avro.AvroRuntimeException: Not a record..

知道我应该如何构建在包含记录类型值的avro架构中设置地图吗?

2 个答案:

答案 0 :(得分:5)

我能够使用以下代码:

Schema mapSchema = schema.getField("log_data").schema().getTypes().get(1);

GenericRecord typeValuePair =  
              new GenericData.Record(mapSchema.getValueType());

ImmutableMap.Builder<String, GenericRecord> logDataBuilder = 
              ImmutableMap.<String, GenericRecord>builder();

typeValuePair.put("type","string");
typeValuePair.put("value", "field1 value");
logDataBuilder.put("field1", typeValuePair);

//Set the log_data map field in the schema
GenericRecordBuilder grb = new GenericRecordBuilder(schema);
grb.set("log_data", logDataBuilder.build());
grb.build();

答案 1 :(得分:0)

下面应该有效

public class NewContactActivity extends AppCompatActivity {
UserDbHelper userDbHelper;
SQLiteDatabase sqLiteDatabase;
EditText editText,editText1,editText2;
Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_contact);
    editText=findViewById(R.id.contect_name);
    editText1=findViewById(R.id.mob_number);
    editText2=findViewById(R.id.email);
}

public void addcontact(View view)
{
    String name= editText.getText().toString();
    String number=editText1.getText().toString();
    String email=editText2.getText().toString();
    userDbHelper=new UserDbHelper(context);
    sqLiteDatabase=userDbHelper.getWritableDatabase();
    userDbHelper.addinformation(name,number,email,sqLiteDatabase);
    Toast.makeText(getBaseContext(), "data saved", Toast.LENGTH_SHORT).show();


}
}