【发布时间】:2016-09-26 20:15:19
【问题描述】:
由于某种原因,如果我添加新列、将字符串附加到现有数据/列或从代码创建新 DataFrame,它会误解字符串数据,因此 show() 无法正常工作,过滤器(例如 withColumn,其中,何时等)不起作用。
这里是示例代码:
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 即当我减少执行程序内存或增加驱动程序内存时问题就消失了。
【问题讨论】:
标签: apache-spark apache-spark-sql hadoop-yarn spark-dataframe