无法找到存储在DataSet

时间:2017-01-09 23:29:58

标签: scala apache-spark

民间 -

我是一个完整的Spark newb,并且一直试图让以下代码在spark-shell中工作。我花了很多时间来审核这些文档并试图解决这个问题但是,我的想法已经用完了。

以下是代码:

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。

非常感谢任何想法。

1 个答案:

答案 0 :(得分:0)

Encoder中的Decimal根本没有spark.implicits。您可以明确地提供它:

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)"))