2017-03-14 9 views
0

は私のコードであるためにデータフレーム空白のレコードを置き換える - >スパークScalaの私はここに「0」</p> <p>私のデータフレームのフィールドの空白のレコードを交換する必要が「0」

import sqlContext.implicits._ 

case class CInspections (business_id:Int, score:String, date:String, type1:String) 

val baseDir = "/FileStore/tables/484qrxx21488929011080/" 
val raw_inspections = sc.textFile (s"$baseDir/inspections_plus.txt") 
val raw_inspectionsmap = raw_inspections.map (line => line.split ("\t")) 
val raw_inspectionsRDD = raw_inspectionsmap.map (raw_inspections => CInspections (raw_inspections(0).toInt,raw_inspections(1), raw_inspections(2),raw_inspections(3))) 
val raw_inspectionsDF = raw_inspectionsRDD.toDF 
raw_inspectionsDF.createOrReplaceTempView ("Inspections") 
raw_inspectionsDF.printSchema 
raw_inspectionsDF.show() 

私はケースクラスを使用していますし、 Dataframeに変換します。しかし、私はいくつかの操作を実行し、ソートする必要があるので、Intとして "スコア"が必要です。 しかし、それをスコアとして宣言すれば、Intは空白の値にエラーが発生します。

java.lang.NumberFormatException:入力文字列の場合:以下のクエリのために、それは一種の文字列としてint型と間違った結果に

sqlContext.sql("""select raw_inspectionsDF.score from raw_inspectionsDF where score <>"" order by score""").show() 

+-----+ 
|score| 
+-----+ 
| 100| 
| 100| 
| 100| 
+-----+ 
を与えていないので、「」

+-----------+-----+--------+--------------------+ 
|business_id|score| date|    type1| 
+-----------+-----+--------+--------------------+ 
|   10|  |20140807|Reinspection/Foll...| 
|   10| 94|20140729|Routine - Unsched...| 
|   10|  |20140124|Reinspection/Foll...| 
|   10| 92|20140114|Routine - Unsched...| 
|   10| 98|20121114|Routine - Unsched...| 
|   10|  |20120920|Reinspection/Foll...| 
|   17|  |20140425|Reinspection/Foll...| 
+-----------+-----+--------+--------------------+ 

私はint型としてフィールドをスコア必要

答えて

1

空の文字列をIntegerに変換できない場合は、スコアがnullableになるようにする必要があります。フィールドがない場合はnullとして表示されます。

import scala.util.{Try, Success, Failure} 

1)文字列をIntに変換できない場合、空の文字列の場合はNoneを返すカスタマイズされた解析関数を定義します。

def parseScore(s: String): Option[Int] = { 
    Try(s.toInt) match { 
    case Success(x) => Some(x) 
    case Failure(x) => None 
    } 
} 

2)Option[Int]タイプであるためにあなたのケースクラスにフィールドスコア定義します。

case class CInspections (business_id:Int, score: Option[Int], date:String, type1:String) 

val raw_inspections = sc.textFile("test.csv") 
val raw_inspectionsmap = raw_inspections.map(line => line.split("\t")) 

3)スコアフィールドを解析するようにカスタマイズparseScore関数を使用。

val raw_inspectionsRDD = raw_inspectionsmap.map(raw_inspections => 
    CInspections(raw_inspections(0).toInt, parseScore(raw_inspections(1)), 
       raw_inspections(2),raw_inspections(3))) 

val raw_inspectionsDF = raw_inspectionsRDD.toDF 
raw_inspectionsDF.createOrReplaceTempView ("Inspections") 

raw_inspectionsDF.printSchema 
//root 
// |-- business_id: integer (nullable = false) 
// |-- score: integer (nullable = true) 
// |-- date: string (nullable = true) 
// |-- type1: string (nullable = true) 

raw_inspectionsDF.show() 

+-----------+-----+----+-----+ 
|business_id|score|date|type1| 
+-----------+-----+----+-----+ 
|   1| null| a| b| 
|   2| 3| s| k| 
+-----------+-----+----+-----+ 

4)ファイルを正しく解析した後、あなたは簡単にを埋めるNA機能を使用して0とnull値を置き換えることができます。

raw_inspectionsDF.na.fill(0).show 
+-----------+-----+----+-----+ 
|business_id|score|date|type1| 
+-----------+-----+----+-----+ 
|   1| 0| a| b| 
|   2| 3| s| k| 
+-----------+-----+----+-----+ 
+0

はあなたの返事のためにどうもありがとうございます!今働いている。 :) –

+0

sqlContext.sqlの中に以下のようにsqlクエリを書くことはできますか?私は以下のクエリでエラーが発生しています - > sqlContext.sql( "" "select" CBusinesses.BUSINESS_ID、CBusinesses.name、CBusinesses.address、CBusinesses.city、CBusinesses.postal_code、CBusinesses.latitude、CBusinesses.longitude、Inspections_notnull.score " –

+0

は本当に答えを知ってはいけないInspections_notnull.score <> 0とCBusinesses.BUSINESS_ID = Inspections_notnull.BUSINESS_ID """:入力文字列の場合).SHOW() はjava.lang.NumberFormatException" CBusinesses、Inspections_notnullからしかし、あなたは2つのテーブルを結合しようとしているようです。 – Psidom

関連する問題