如何在scala中的avro文件中提取数组的一部分?

时间:2017-07-06 05:50:17

标签: scala apache-spark 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;

List [TRUEntry]是我正在解析的数组。我就是这样做的。

    this.uids = Nil
    row.getAs[Seq[Row]]("uids")
    .foreach((objRow: Row) => 
      this.uids ::= (new TRUEntry(objRow))
    )

这就是我解析uids的方式:

 this.uids    
.foreach((obj:TRUEntry) => {
  uInfo += obj.uId + " , " + obj.initM.toString() + " , "
})    

如何在以下代码中从上面的数组中提取并传递obj.uid:

 val avroParsed = avroRow
    .map(x => new TRParser(x))
    .map((obj: TRParser) => ((obj.tids, **obj.uId**),1))

1 个答案:

答案 0 :(得分:0)

可以使用以下代码完成:

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)
    })

tid和uid的值保存为单独的变量,然后可以在'for'循环中处理变量。