Как сопоставить один столбец с другими столбцами в файле avro?
Я использую Spark 2.1.1 и Scala 2.11.8
Этот вопрос является продолжением одного из моих предыдущих вопросов:
Как определить пустые поля в CSV-файле?
Изменение заключается в том, что вместо чтения данных из файла CSV я теперь читаю данные из файла avro. Это формат файла avro, из которого я читаю данные:
var ttime: Long = 0;
var eTime: Long = 0;
var tids: String = "";
var tlevel: Integer = 0;
var tboot: Long = 0;
var rNo: Integer = 0;
var varType: String = "";
var uids: List[TRUEntry] = Nil;
Я разбираю файл avro в отдельном классе.
Я должен сопоставить столбец tids с каждым из uids таким же образом, как упомянуто в принятом ответе по ссылке, опубликованной выше, за исключением этого времени из файла avro, а не из хорошо отформатированного файла csv. Как я могу это сделать?
Вот код, с которым я пытаюсь это сделать:
val avroRow = spark.read.avro(inputString).rdd
val avroParsed = avroRow
.map(x => new TRParser(x))
.map((obj: TRParser) => ((obj.tids, obj.uId ),1))
.reduceByKey(_+_)
.saveAsTextFile(outputString)
После obj.tids все столбцы uids должны отображаться индивидуально, чтобы получить окончательный результат, такой же, как указано в принятом ответе по вышеуказанной ссылке.
Вот как я анализирую все uid в классе разбора файла avro:
this.uids = Nil
row.getAs[Seq[Row]]("uids")
.foreach((objRow: Row) =>
this.uids ::= (new TRUEntry(objRow))
)
this.uids
.foreach((obj:TRUEntry) => {
uInfo += obj.uId + " , " + obj.initM.toString() + " , "
})
PS: прошу прощения, если вопрос кажется тупым, но это мое первое знакомство с файлом avro
1 ответ
Это может быть сделано, передавая то же самое для обработки цикла
this.uids
в основном коде как:
val avroParsed = avroRow
.map(x => new TRParser(x))
.map((obj: TRParser) => {
val tId = obj.source.trim
var retVal: String = ""
obj.uids
.foreach((obj: TRUEntry) => {
retVal += tId + "," + obj.uId.trim + ":"
})
retVal.dropRight(1)
})
val flattened = avroParsed
.flatMap(x => x.split(":"))
.map(y => ((y),1))