更改 Spark 数据框列类型会导致错误
Posted
技术标签:
【中文标题】更改 Spark 数据框列类型会导致错误【英文标题】:Changing Spark dataframe column types leads to error 【发布时间】:2016-06-01 16:44:41 【问题描述】:我在 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:作业因阶段失败而中止:阶段 3.0 中的任务 0 失败 1 次,最近一次失败:阶段 3.0 中丢失任务 0.0(TID 3,本地主机):java.util.concurrent.ExecutionException:java .lang.Exception:编译失败:org.codehaus.commons.compiler.CompileException:文件'generated.java',第97行,第45列:十进制第 97 行如下所示:
Decimal tmpDecimal18 = Decimal.apply(new java.math.BigDecimal(primitive17.toString()));
【问题讨论】:
如何创建minimal reproducible example 【参考方案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._
现在看来一切正常。
【讨论】:
以上是关于更改 Spark 数据框列类型会导致错误的主要内容,如果未能解决你的问题,请参考以下文章
展平并从 Spark 中的 Struct 类型数据框列中读取值
从 Spark 数据框列中 ArrayType 类型的行中获取不同的元素
为啥在一种情况下更改熊猫数据框列中的值很快,而在另一种情况下更改速度很慢?