2015-11-26 11 views
6

के लिए एवरो में जेनेरिक रिकार्ड से विशिष्ट रिकॉर्ड में कनवर्ट करने के लिए कैसे करें स्कीमा विकास के साथ संगत एवरो विशिष्ट रिकॉर्ड (यानी जेनरेटेड जावा क्लास) है? अर्थात। अगर मेरे पास एवरो संदेश का स्रोत है (मेरे मामले में, काफ्का) और मैं उन संदेशों को एक विशिष्टरेकॉर्ड में deserialize करना चाहता हूं, क्या यह सुरक्षित रूप से करना संभव है?संगत स्कीमा

मैं क्या देखें:

  • एक स्कीमा के अंत में एक क्षेत्र को जोड़ने के ठीक काम करता है - ठीक deserialize कर सकते हैं उसके बीच में कोई क्षेत्र जोड़ने specificrecord को
  • नहीं है - यानी टूट जाता है मौजूदा ग्राहकों

यहां तक ​​कि यदि संदेश संगत हैं, तो यह एक समस्या है।

मैं नए स्कीमा (जैसे संगामी स्कीमा रजिस्ट्री का प्रयोग करके) मैं GenericRecord को deserialize सकते हैं, लेकिन वहाँ एक रास्ता अलग स्कीमा के specificrecord को genericrecord से मैप करने के लिए होना प्रतीत नहीं होता है ढूँढ सकते हैं ..

MySpecificType message = (T SpecificData.get().deepCopy(MySpecificType.SCHEMA$, genericMessage); 

Deepcopy विभिन्न स्थानों में बताया गया है, लेकिन यह का उपयोग करता सूचकांक तो काम नहीं करता है ..

कोई सुरक्षित तरीका दो एवरो वस्तुओं के बीच मैप करने के लिए आप दोनों स्कीमा है और वे संगत हैं जब है? यहां तक ​​कि अगर मैं जेनेरिककॉर्ड से जेनेरिक्रेकॉर्ड तक मैप कर सकता हूं, तो ऐसा होगा क्योंकि मैं नौकरी को पूरा करने के लिए गहरी कॉपी कर सकता हूं।

+2

में मदद करता है आप कभी भी यह पता लगाने ऐसा करने के तरीके की थी? मैं एक ही समस्या पर फंस गया हूं, "org.apache.avro.generic.GenericData $ रिकॉर्ड प्राप्त करना जारी रखना org.apache.avro.specific.SpecificRecord" त्रुटि ... – Matt

+1

मैंने मैप किए गए ऑटोमैपर क्लास का उपयोग किया क्षेत्र के नाम पर आधारित है। एक उदाहरण कार्यान्वयन यहां है: https://gist.github.com/markdav/01623363b5b2508b8e5ef6146caedb1b –

उत्तर

2

विशिष्ट डेटा प्रकार रूपांतरण के लिए यहां उदाहरण परीक्षण हैं। यह सब विन्यास में 'specificDeserializerProps'

https://github.com/confluentinc/schema-registry/blob/master/avro-serializer/src/test/java/io/confluent/kafka/serializers/KafkaAvroSerializerTest.java

मैं निम्नलिखित config जोड़ा गया है और चाहता था के रूप में विशिष्ट प्रकार के बाहर हो गया।

HashMap<String, String> specificDeserializerProps = new HashMap<String, String>(); 
specificDeserializerProps.put(KafkaAvroDeserializerConfig.SCHEMA_REGISTRY_URL_CONFIG, "bogus"); 
specificDeserializerProps.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, "true"); 
specificAvroDeserializer = new KafkaAvroDeserializer(schemaRegistry, specificDeserializerProps); 

आशा है कि

+0

यह deserializer नया है .. मैं इसे आज़माउंगा! –

संबंधित मुद्दे