Spark Scala将数据框空白记录替换为;0“;

Spark Scala将数据框空白记录替换为;0“;,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我需要将数据框字段的空白记录替换为“0” 这是我的代码--> 我使用case类,然后转换为Dataframe。但是我需要像Int一样的“score”,因为我必须执行一些操作并对其排序。 但若我将其声明为score:Int,那个么对于空白值,我会得到一个错误 java.lang.NumberFormatException:用于输入字符串:“” 我需要分数字段为Int,因为对于下面的查询,它排序为String而不是Int,并给出错误的结果 sqlContext.sql("""select raw_i

我需要将数据框字段的空白记录替换为“0”

这是我的代码-->

我使用case类,然后转换为Dataframe。但是我需要像Int一样的“score”,因为我必须执行一些操作并对其排序。 但若我将其声明为score:Int,那个么对于空白值,我会得到一个错误

java.lang.NumberFormatException:用于输入字符串:“”

我需要分数字段为Int,因为对于下面的查询,它排序为String而不是Int,并给出错误的结果

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

+-----+
|score|
+-----+
|  100|
|  100|
|  100|
+-----+
sqlContext.sql(““从原始检查DF中选择原始检查DF.score,其中score”“按分数排序”“”).show()
+-----+
|得分|
+-----+
|  100|
|  100|
|  100|
+-----+

空字符串无法转换为整数,您需要将分数
设为可空
,这样,如果字段缺失,则表示为空,您可以尝试以下操作:

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) 将案例类中的分数字段定义为
选项[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函数fill轻松地将空值替换为0:


非常感谢您的及时回复!现在可以工作了。:)我是否可以在sqlContext.sql中编写sql查询,如下所示?下面的查询->sqlContext.sql(“”)出现错误“选择CBusinesses.BUSINESS\u ID、CBusinesses.name、CBusinesses.address、CBusinesses.city、CBusinesses.postal\u code、CBusinesses.latitude、CBusinesses.longitude、CBusinesses中的Inspections\u notnull.score 0和CBusinesses.BUSINESS\u ID=Inspections\u notnull.BUSINESS\u ID”“”)。show()java.lang.NumberFormatException:对于输入字符串:“我真的不知道答案,但似乎您正在尝试合并两个表,可能您想要加入?是的。我想计算哪10个企业得分最低?”我有两个表-“Businesss”和“inspections”,带有business\u id公用键。它可以与sql配合使用,但是如果我在spark中使用相同的查询,它就不起作用了。我如何用一列连接两个表并使用Spark Sql计算最高分?我也尝试了//val df=businessesDF.join(原始检查df,businessesDF.col(“业务ID”)==原始检查df.col(“业务ID”)),但它也给出了错误
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"))
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|
+-----------+-----+----+-----+
raw_inspectionsDF.na.fill(0).show
+-----------+-----+----+-----+
|business_id|score|date|type1|
+-----------+-----+----+-----+
|          1|    0|   a|    b|
|          2|    3|   s|    k|
+-----------+-----+----+-----+