Как сопоставить один столбец с другими столбцами в файле 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 с каждым из uid так же, как указано в принятом ответе по ссылке, опубликованной выше, за исключением того, что на этот раз из файла 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() + " , "
})   

P.S. Прошу прощения, если вопрос покажется глупым, но это моя первая встреча с файлом avro.


person PixieDev    schedule 05.07.2017    source источник


Ответы (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))
person PixieDev    schedule 10.07.2017