2017-01-09 87 views
1

Folks-無法找到存儲在DataSet

我是一個完整的Spark福利局,並已試圖讓下面的代碼在spark-shell工作在過去的一天小數型編碼器。我花時間審閱了文檔,並嘗試Google解決這個問題,但是我的想法已經過時。

下面是代碼:

import spark.implicits._ 
val opts = Map(
    "url" -> "jdbc:netezza://netezza:5480/test_schema", 
    "user" -> "user", 
    "password" -> "password", 
    "dbtable" -> "test_messages", 
    "numPartitions" -> "48" 
) 

val sqlContext = new org.apache.spark.sql.SQLContext(sc) 

val site = sqlContext 
    .read() 
    .format("com.ibm.spark.netezza") 
    .options(opts) 
    .load() 
    .select("az","range","time") 
    .where("id == 34000007") 

site.printSchema()說明所有列的類型的decimal

val calcs = ama.agg(
    min("az"), (max("az")-min("az")).divide(100), 
    min("range"), (max("range")-min("range")).divide(100), 
    min("time"), (max("time")-min("time")).divide(100) 
).collect()(0) 

calcs.printSchema()說明所有列的類型都是decimal

一切正常,直到這條線。我認爲,通過import spark.implicits._這將使我能夠訪問Encoder,但是,情況並非如此。

val newSite = site.map(r => r.getDecimal(0).subtract(calcs.getDecimal(0))) 

我回顧的每篇文章都會談到關於導入implicits的問題,但這並沒有幫助。我正在使用Spark 2.0.2。

任何想法將不勝感激。

回答

0

spark.implicits中根本沒有Encoder。您可以提供,要麼明確:

import org.apache.spark.sql.types.DecimalType 
import org.apache.spark.sql.Encoders 

val dt = DecimalType(38, 0) 
val df = Seq((1, 2)).toDF("x", "y").select($"x".cast(dt), $"y".cast(dt)) 

df.map(r => r.getDecimal(0).subtract(r.getDecimal(1)))(Encoders.DECIMAL).first 
java.math.BigDecimal = -1.000000000000000000 

implicitly

implicit val decimalEncoder = Encoders.DECIMAL 

df.map(r => r.getDecimal(0).subtract(r.getDecimal(1))).first 
java.math.BigDecimal = -1.000000000000000000 

話雖這麼說,這可能是一個更好的主意,用DataFrames一路例如:

site.select($"az" - calcs.getDecimal(0)) 

site.select($"az" - calcs.getAs[java.math.BigDecimal]("min(az)")) 
相關問題