2017-05-19 8 views
0

値が二重引用符で囲まれた列の1つを持つcsvファイルがあります。この列にもカンマが入ります。 Scalaを使用してRVDにSparkでこのタイプの列をCSV形式で読み取るにはどうすればよいですか。二重引用符で囲まれた列の値は、「総資産」、「総負債」などの値であるため、整数型として読み取られる必要があります。 csvファイルからスカラを使用してSparkでRDDを作成するための区切り文字と数値データを含むCSVファイルを読み込みます。

例のレコードが

Jennifer,7/1/2000,0,,0,,151,11,8,"25,950,816","5,527,524",51,45,45,45,48,50,2,, 
John,7/1/2003,0,,"200,000",0,151,25,8,"28,255,719","6,289,723",48,46,46,46,48,50,2,"4,766,127,272",169 
+0

私は{val result = input.map(x => x.split( "、"))}を試しました。これは、1行の値として25を取り、1行目から別の列の値として950を取っていますが、それ以上のアイデアは得られませんでした。 – ibh

答えて

0

それがうまく
あなたのニーズを満たすためのメカニズムと柔軟api Sをテストしているように、私はあなたが

を行うことができます csvファイルとして SQLContextで読むことをお勧めしています
val dataframe =sqlContext.read.csv("path to your csv file") 

出力は次のようになり

+-----------+--------+---+----+-------+----+---+---+---+----------+---------+----+----+----+----+----+----+----+-------------+----+ 
|  _c0|  _c1|_c2| _c3| _c4| _c5|_c6|_c7|_c8|  _c9|  _c10|_c11|_c12|_c13|_c14|_c15|_c16|_c17|   _c18|_c19| 
+-----------+--------+---+----+-------+----+---+---+---+----------+---------+----+----+----+----+----+----+----+-------------+----+ 
| Jennifer|7/1/2000| 0|null|  0|null|151| 11| 8|25,950,816|5,527,524| 51| 45| 45| 45| 48| 50| 2|   null|null| 
|Afghanistan|7/1/2003| 0|null|200,000| 0|151| 25| 8|28,255,719|6,289,723| 48| 46| 46| 46| 48| 50| 2|4,766,127,272| 169| 
+-----------+--------+---+----+-------+----+---+---+---+----------+---------+----+----+----+----+----+----+----+-------------+----+ 

今、あなたはheader nameschange the required columns to integersを変更し、あなたがRDDで読み、RDDに滞在することを好む場合はあなたも その後、
を編集rdd
に変更することができ、物事
の多くを行うことができます
textFile

val rdd = sparkContext.textFile("/home/anahcolus/IdeaProjects/scalaTest/src/test/resources/test.csv") 
としてsparkContextでファイルを読みます

は次に、この@ibh "

rdd.map(line => line.split(",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)", -1)) 
0

間に,を無視することによって,で行を分割するには、特定のものを火花あるいはスカラではありません。あなたは通常の方法でファイルを読むでしょう。

 val conf = new SparkConf().setAppName("app_name").setMaster("local") 
     val ctx = new SparkContext(conf) 
     val file = ctx.textFile("<your file>.csv") 
     rdd.foreach{line => 
     // cleanup code as per regex below 
     val tokens = line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1) 
     // side effect 
     val myObject = new MyObject(tokens) 
     mylist.add(myObject) 
    } 

this regexも参照してください。

+0

このアプローチで問題が解決しました。ありがとう – ibh

+0

良い@オプション..ありがとう –

関連する問題