簡體   English   中英

有條件地在Scala / Spark的CSV文件中映射行,以生成另一個CSV文件

[英]Conditionally map through rows in CSV file in Scala / Spark to produce another CSV file

我對Scala / Spark還是陌生的,我被深深地吸引了。 自幾周以來,我一直在努力為Scala 2.11.8上一個看似簡單的問題找到解決方案,但一直沒有找到一個好的解決方案。 我有一個接近150 GB的csv格式的大型數據庫,其中有很多空值,需要根據各個列的值進行減少和清除。

原始CSV文件的架構如下:

  • 第1欄:Double
  • 列2:整數
  • 第3欄:Double
  • 專欄4:雙
  • 列5:整數
  • 第6欄:雙
  • 列7:整數

因此,我想有條件地映射CSV文件的所有行,並將結果導出到另一個CSV文件,每行具有以下條件:

  1. 如果第4列的值不為空,則該行的第4、5、6和7列的值應存儲為名為lastValuesOf4to7的數組。 (在數據集中,如果第4列中的元素不為null,則第1、2和3列為null,可以忽略)

  2. 如果列3的值不為null,則如上所述,列1、2和3的值以及lastValuesOf4to7數組中的四個元素應作為新行導出到另一個名為condensed.csv的CSV文件中。 (在數據集中,如果第3列中的元素不為null,則第4、5、6和7列為null,可以忽略)

因此,最后我應該得到一個名為condensed.csv的csv文件,該文件有7列。

我嘗試在Scala中使用以下代碼,但無法進一步進行開發:

import scala.io.Source

object structuringData {
  def main(args: Array[String]) {

  val data = Source.fromFile("/path/to/file.csv") 

  var lastValuesOf4to7 = Array("0","0","0","0")

  val lines = data.getLines // Get the lines of the file

  val splitLine = lines.map(s => s.split(',')).toArray // This gives an out of memory error since the original file is huge.



  data.close
  }
}

從上面的代碼中可以看到,我試圖將其移動到數組中,但是由於無法單獨處理每一行而無法繼續進行。

我相當肯定,在Scala / Spark上必須有直接的解決方案來處理csv文件。

使用Spark-csv程序包,然后使用Sql查詢來查詢數據並根據您的用例進行過濾,然后最后將其導出。

如果您使用的是spark 2.0.0,則spark-csv將出現在spark-sql中;否則,如果使用的是舊版本,請相應地添加依賴項。

您可以在此處找到指向spark-csv的鏈接。

您也可以在此處查看示例: http : //blog.madhukaraphatak.com/analysing-csv-data-in-spark/

感謝您的答復。 我設法使用Bash腳本自己創建了一個解決方案。 我必須首先從一個空白的condensed.csv文件開始。 我的代碼顯示實現此目標有多么容易:

#!/bin/bash
OLDIFS=$IFS
IFS=","
last1=0
last2=0
last3=0
last4=0
while read f1 f2 f3 f4 f5 f6 f7
do
    if [[ $f4 != "" ]];
    then 
        last1=$f4
        last2=$f5
        last3=$f6
        last4=$f7

    elif [[ $f3 != "" ]];
    then 
        echo "$f1,$f2,$f3,$last1,$last2,$last3,$last4" >> path/to/condensed.csv
    fi

done < $1
IFS=$OLDIFS

如果腳本以名稱extractcsv.sh保存,則應使用以下格式運行該腳本:

$ ./extractcsv.sh path/to/original/file.csv

這僅是為了證實我的觀察,即ETL在Bash上比在Scala中更容易。 不過,謝謝您的幫助。

暫無
暫無

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

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