何かの理由で、新しい列を追加したり、既存のデータ/列に文字列を追加したり、新しいDataFrameをコードから作成すると、文字列データが誤解されるため、show()適切に動作し、フィルター(withColumn、where、whenなど)がetherを動かさない。私はローカルモードで実行した場合、予想通りその後、すべての作品Spark DataFrame糸クライアントモードで文字列データを失う
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
しかし、私は糸クライアントモードで同じコードを実行するときには、生産します:
この問題は文字列値にのみ存在するため、最初の列(整数)は問題ありません。また
私はデータフレームからRDD作成していた場合、その後、すべてがi.e. df.rdd.take(1).apply(0).getString(1)
結構です私は、Spark 1.5.0を使用していEDIT
CDH 5.5.2から: この問題が発生したと思われますドライバメモリとエグゼキュータメモリの差が高すぎる場合
--driver-memory xxG --executor-memory yyG
つまり、エグゼキュータメモリを減らしたりドライバメモリを増やしたりすると、問題は消えます。