民间 -
我是一个完整的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。
非常感谢任何想法。
答案 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)"))