Spark DataFrame在yarn-client模式下丢失字符串数据

时间:2016-09-26 20:15:20

标签: apache-spark apache-spark-sql yarn spark-dataframe

出于某种原因,如果我添加新列,将字符串附加到现有数据/列或从代码创建新的DataFrame,则会误解字符串数据,因此show()无法正常工作,过滤器(例如就像柱子一样,在哪里,何时等都不起作用。

以下是示例代码:

object MissingValue {
  def hex(str: String): String = str.getBytes("UTF-8").map(f => Integer.toHexString((f&0xFF)).toUpperCase).mkString("-")

  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("MissingValue")
    val sc = new SparkContext(conf)
    sc.setLogLevel("WARN")
    val sqlContext = new SQLContext(sc)
    import sqlContext.implicits._

    val list = List((101,"ABC"),(102,"BCD"),(103,"CDE"))
    val rdd = sc.parallelize(list).map(f => Row(f._1,f._2))
    val schema = StructType(StructField("COL1",IntegerType,true)::StructField("COL2",StringType,true)::Nil)
    val df = sqlContext.createDataFrame(rdd,schema)
    df.show()

    val str = df.first().getString(1)
    println(s"${str} == ${hex(str)}")

    sc.stop()
  }
}

如果我在本地模式下运行它,那么一切都按预期工作:

+----+----+
|COL1|COL2|
+----+----+
| 101| ABC|
| 102| BCD|
| 103| CDE|
+----+----+

ABC == 41-42-43

但是当我在yarn-client模式下运行相同的代码时,它会生成:

+----+----+
|COL1|COL2|
+----+----+
| 101| ^E^@^@|
| 102| ^E^@^@|
| 103| ^E^@^@|
+----+----+

^E^@^@ == 5-0-0

此问题仅存在于字符串值中,因此第一列(整数)正常。

另外,如果我从数据框创建rdd,那么一切都很好i.e. df.rdd.take(1).apply(0).getString(1)

我使用的是CDH 5.5.2中的Spark 1.5.0

修改 当驱动程序内存和执行程序内存之间的差异过高--driver-memory xxG --executor-memory yyG时,即当我减少执行程序内存或增加驱动程序内存时,问题就会消失,这似乎会发生这种情况。

1 个答案:

答案 0 :(得分:0)

这是与执行程序内存和Oops大小相关的错误:

https://issues.apache.org/jira/browse/SPARK-9725
https://issues.apache.org/jira/browse/SPARK-10914
https://issues.apache.org/jira/browse/SPARK-17706

它已在Spark版本1.5.2中修复