2015-10-09 47 views
2

我已將我的記錄保存爲parquet格式並使用Spark1.5。但是,當我試圖把它拿來拋出異常SQLcontext將字符串字段更改爲Long:Spark 1.5

java.lang.ClassCastException列:java.lang.Long中不能轉換爲org.apache.spark.unsafe.types.UTF8String。

在寫作實木複合地板時,此字段將保存爲字符串。因此,這裏的示例代碼和輸出相同..

logger.info("troubling thing is ::" + 
    sqlContext.sql(fileSelectQuery).schema().toString()); 

DataFrame df= sqlContext.sql(fileSelectQuery); 

JavaRDD<Row> rdd2 = df.toJavaRDD(); 

*第一行代碼(記錄器)打印此:

煩惱的事是:: StructType(StructField(BATCH_ID,StringType ,true))*

但是在出現異常之後的那一刻。

任何想法爲什麼它將該字段視爲Long? (是關於專欄的一個獨特的東西,它總是一個數字,例如時間戳)。

任何幫助表示讚賞。

+0

你檢查元數據? – zero323

+0

我真的建議你使用Scala而不是Java,但是你可以使用udf並改變操作後返回的數據類型,在Scala中它很簡單 –

回答

3

所以我找到了問題的解決方案。

  1. 我沒有開始使用SCALA。
  2. 做了更多的搜索和閱讀,發現這個:

http://spark.apache.org/docs/latest/sql-programming-guide.html#partition-discovery

注意,分區列的數據類型是 自動推斷。目前,支持數字數據類型和字符串類型 。有時用戶可能不希望自動推斷分區列的數據類型 。對於這些用途的情況下,自動 類型推斷可以被配置爲通過 spark.sql.sources.partitionColumnTypeInference.enabled,這是 默認爲true。當禁用類型推斷時,用於分區列的字符串類型將爲 。

而且在更改提到的配置後,問題解決像魅力。 :)