2016-09-26 5 views
0

何かの理由で、新しい列を追加したり、既存のデータ/列に文字列を追加したり、新しい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つまり、エグゼキュータメモリを減らしたりドライバメモリを増やしたりすると、問題は消えます。

答えて

関連する問題