出于某种原因,如果我添加新列,将字符串附加到现有数据/列或从代码创建新的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
时,即当我减少执行程序内存或增加驱动程序内存时,问题就会消失,这似乎会发生这种情况。
答案 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中修复