簡體   English   中英

將RDD [String]轉換為RDD [Row]轉換為Dataframe Spark Scala

[英]Convert RDD[String] to RDD[Row] to Dataframe Spark Scala

我正在讀取一個包含很多空格的文件,需要過濾掉該空格。 之后,我們需要將其轉換為數據框。 下面的示例輸入。

2017123 ¦     ¦10¦running¦00000¦111¦-EXAMPLE

我對此的解決方案是以下函數,該函數解析所有空間並修剪文件。

def truncateRDD(fileName : String): RDD[String] = {
    val example = sc.textFile(fileName)
    example.map(lines => lines.replaceAll("""[\t\p{Zs}]+""", ""))
}

但是,我不確定如何將其放入數據框。 sc.textFile返回RDD[String] 我嘗試了案例類方式,但問題是我們有800個字段模式,案例類不能超過22。

我正在考慮以某種方式將RDD [String]轉換為RDD [Row],以便可以使用createDataFrame函數。

val DF = spark.createDataFrame(rowRDD, schema)

有關如何執行此操作的任何建議?

首先將字符串拆分/解析為字段。

rdd.map( line => parse(line))其中parse是某種解析函數。 它可能像split一樣簡單,但是您可能需要更強大的功能。 這將為您提供RDD[Array[String]]或類似名稱。

然后您可以使用rdd.map(a => Row.fromSeq(a))轉換為RDD[Row]

從那里,您可以將sqlContext.createDataFrame(rdd, schema)轉換為DataFrame sqlContext.createDataFrame(rdd, schema)其中rdd是您的RDD[Row]而schema是您的模式StructType。

就您而言,簡單的方法是:

 val RowOfRDD = truncateRDD("yourfilename").map(r => Row.fromSeq(r)) 

如果您使用的是Scala 2.10,如何解決productarity問題?

但是,我不確定如何將其放入數據框。 sc.textFile返回RDD [String]。 我嘗試了案例類方式,但問題是我們有800個字段模式,案例類不能超過22。

是的,有一些局限性,例如生產productarity但我們可以克服...您可以像<版本2.11的以下示例所示進行操作:

准備一個extends Product並覆蓋方法的case類。

喜歡...

  • productArity():Int:這將返回屬性的大小。 在我們的例子中,它是33。因此,我們的實現如下所示:

  • productElement(n:Int):Any:給定索引,將返回屬性。 作為保護,我們還有一個默認情況,它會引發IndexOutOfBoundsException異常:

  • canEqual (that:Any):Boolean :這是三個函數中的最后一個,當對類進行相等檢查時,它作為邊界條件:


暫無
暫無

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

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