Speicherung von null-Werten in der avro-Dateien
Habe ich einige json-Daten, die wie folgt aussieht:
{
"id": 1998983092,
"name": "Test Name 1",
"type": "search string",
"creationDate": "2017-06-06T13:49:15.091+0000",
"lastModificationDate": "2017-06-28T14:53:19.698+0000",
"lastModifiedUsername": "[email protected]",
"lockedQuery": false,
"lockedByUsername": null
}
Ich bin in der Lage, fügen Sie die lockedQuery null-Wert zu einem GenericRecord Objekt, ohne Frage.
GenericRecord record = new GenericData.Record(schema);
if(json.isNull("lockedQuery")){
record.put("lockedQuery", null);
}
Jedoch, später, wenn ich Versuch zu schreiben, dass GenericRecord Objekt zu einem avro-Datei erhalte ich eine null-pointer-exception.
File file = new File("~/test.arvo");
DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>(schema);
DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<>(datumWriter);
dataFileWriter.create(schema, file);
for(GenericRecord record: masterList) {
dataFileWriter.append(record); //NULL POINTER HERE
}
Wenn ich mit diesem code bekomme ich folgende exception. Irgendwelche Tipps, wie zu verarbeiten, einen null-Wert in eine Avro Datei sehr geschätzt. Vielen Dank im Voraus.
java.lang.NullPointerException: null of boolean in field lockedQuery of
com.mydomain.test1.domain.MyAvroRecord
Exception in thread "main" java.lang.RuntimeException:
org.apache.avro.file.DataFileWriter$AppendWriteException:
java.lang.NullPointerException: null of boolean in field lockedQuery of
com.mydomain.test1.domain.MyAvroRecord
at com.mydomain.avro.App.main(App.java:198)
Caused by: org.apache.avro.file.DataFileWriter$AppendWriteException:
java.lang.NullPointerException: null of boolean in field lockedQuery of
com.mydomain.test1.domain.MyAvroRecord
at org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:308)
EDIT: hier ist der MyAvroRecord
public class MyAvroRecord {
long id;
String name;
String type;
Date timestamp;
Date lastModifcationDate;
String lastModifiedUsername;
Boolean lockedQuery;
- Es würde wahrscheinlich helfen, haben die definition von
MyAvroRecord
. Ich bin nicht besonders ein Avro-Spezialist, aber im Allgemeinen in Java nicht speichernnull
imboolean
(Kleinbuchstaben) - Feld, wie es ist eine primitive. Wenn Sie möchten, speichern einen null-Wert in einen booleschen Wert, Sie haben zu verwendenBoolean
(upper case), was ist ein Objekt und kann null sein. - Danke für die Anregung. Ich fügte hinzu, die member-Definitionen von MyAvroRecord. Die schema-Datei, die den Typen entspricht. Ich war mit booleschen und-Schalter Boolean-Objekte, haben aber immer noch die gleiche null-Zeiger. Wenn ich speichern "false" als Standardwert der Fehler geht Weg aber ich kann immer noch nicht null-mit einem Objekt basiert Boolean.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Setzen zu können Avro Feld
null
sollten Sie dies in Avro-schema, indemnull
als eine der möglichen Arten des Feldes. Werfen Sie einen Blick auf Beispiel von Avro-Dokumentation:hier
userName
ist deklariert als composite-Typ, die man entwedernull
oderstring
. Diese Art der definition können SieuserName
- Feld auf null. Als KontrastuserId
können nur enthalten long-Werte, daher versuchenuserId
auf null wird das Ergebnis inNullPointerException
..type(SchemaBuilder.unionOf().nullType().and().stringType().endUnion())
Ich habe dieses Problem auch und jetzt ist es behoben.
Fand ich
@Nullable
Anmerkung in Apache Avro zu erklären, das Feld null-Werte zulässt.So, in diesem Beispiel, wir sollten