更改Spark数据帧列类型会导致错误

时间:2016-06-01 16:44:41

标签: scala apache-spark casting spark-dataframe jupyter-notebook

我在Jupyter笔记本中运行Spark(使用jupyter-scala内核)。我有一个包含String类型列的数据框,我想要一个新的数据框,这些值的类型为Int。我已经尝试过这篇文章中的所有答案:

How to change column types in Spark SQL's DataFrame?

但我一直收到错误:

org.apache.spark.SparkException: Job aborted due to stage failure

特别是,我收到此错误消息:

org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 43, Column 44: Decimal

所以我去看了第43行:

/* 043 */ Decimal tmpDecimal6 = Decimal.apply(new java.math.BigDecimal(primitive5.toString()));

到目前为止,我所尝试的一切都没有效果。

这是一个简单的例子:

val dF = sqlContext.load("com.databricks.spark.csv", Map("path" -> "../P80001571-ALL.csv", "header" -> "true"))
val dF2 = castColumnTo( dF, "contbr_zip", IntegerType )
dF2.show


val dF = sqlContext.load("com.databricks.spark.csv", Map("path" -> 

其中castColumnTo是由Martin Senne在上述帖子中建议的:

object DFHelper
  def castColumnTo( df: DataFrame, cn: String, tpe: DataType ) : DataFrame = {
    df.withColumn( cn, df(cn).cast(tpe) )
  }
}

这是错误:

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 3.0 failed 1 times, most recent failure: Lost task 0.0 in stage 3.0 (TID 3, localhost): java.util.concurrent.ExecutionException: java.lang.Exception: failed to compile: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 97, Column 45: Decimal

第97行看起来像这样:

Decimal tmpDecimal18 = Decimal.apply(new java.math.BigDecimal(primitive17.toString()));

1 个答案:

答案 0 :(得分:1)

我似乎已经解决了这个问题;这与我设置Spark在笔记本中运行的方式有关。

这就是我之前所拥有的:

@transient val Spark = new ammonite.spark.Spark

import Spark.{ sparkConf, sc, sqlContext }
sc
import sqlContext.implicits._
import sqlContext._

这就是我现在所拥有的:

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
val conf = new SparkConf().setAppName("appname").setMaster("local")
val sc = new SparkContext(conf)
import org.apache.spark.sql.SQLContext
val sqlContext = new SQLContext(sc)

sqlContext
import sqlContext._
import sqlContext.implicits._

现在似乎正在发挥作用。