簡體   English   中英

如何將RDD [(String,Any)]轉換為Array(Row)?

[英]how to convert RDD[(String, Any)] to Array(Row)?

我有一個帶有鍵和值的非結構化RDD。 值是RDD [Any],鍵當前是Strings,RDD [String],主要包含Maps。 我想將它們設置為Row類型,以便最終制作一個數據框。 這是我的rdd:

已移除

除了最后4個鍵外,大多數rdd都遵循一種模式,該如何處理? 也許將它們拆分為自己的rdd,尤其是對於reverseDeltas?

謝謝

編輯

到目前為止,根據下面的第一個答案,這就是我很累的地方。

case class MyData(`type`: List[String], libVersion: Double, id: BigInt)

object MyDataBuilder{
    def apply(s: Any): MyData = {
      // read the input data and convert that to the case class

      s match {
        case Array(x: List[String], y: Double, z: BigInt) => MyData(x, y, z)
        case Array(a: BigInt, Array(x: List[String], y: Double, z: BigInt)) => MyData(x, y, z)
        case _ => null
      }
    }
  }

val parsedRdd: RDD[MyData] = rdd.map(x => MyDataBuilder(x))

如何看不到匹配任何這些情況,如何在Scala中的Map進行匹配? 打印出parsedRdd時,我不斷返回null

要將RDD轉換為數據框,您需要具有固定的架構。 如果為RDD定義架構,其余的操作很簡單。

就像是

val rdd2:RDD[Array[String]] = rdd.map( x => getParsedRow(x)) 
val rddFinal:RDD[Row] = rdd2.map(x => Row.fromSeq(x))

備用

case class MyData(....) // all the fields of the Schema I want
object MyDataBuilder {
  def apply(s:Any):MyData ={
    // read the input data and convert that to the case class
  }
}

val rddFinal:RDD[MyData] = rdd.map(x => MyDataBuilder(x))
import spark.implicits._
val myDF = rddFinal.toDF

有一種將rdd轉換為數據幀的方法,如下所示

val rdd = sc.textFile("/pathtologfile/logfile.txt")
val df = rdd.toDF()

不,你有數據框使用下面的SQL查詢做你想做的事

val textFile = sc.textFile("hdfs://...")
// Creates a DataFrame having a single column named "line"
val df = textFile.toDF("line")
val errors = df.filter(col("line").like("%ERROR%"))
// Counts all the errors
errors.count()
// Counts errors mentioning MySQL
errors.filter(col("line").like("%MySQL%")).count()
// Fetches the MySQL errors as an array of strings
errors.filter(col("line").like("%MySQL%")).collect()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM