我在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()));
答案 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._
现在似乎正在发挥作用。