[英]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))
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.