【问题标题】:Spark Scala - converting Dataframe with one record and one column into DoubleSpark Scala - 将具有一条记录和一列的 Dataframe 转换为 Double
【发布时间】:2017-01-22 02:40:05
【问题描述】:

我编写的 scala 代码给了我数据类型错误。主要方法 testpredict_02 采用 Double。

val featuresMD = hiveContext.read.parquet("hdfs://machine01:9000/models/nb/metadata/features")

def testpredict_02(VData: Vector) = { MyModel.predict(VData) }

def outerpredict_02(argincome: String,argage: String,arggender: String) = { 
featuresMD.registerTempTable("features_md")

val income = hiveContext.sql("select distinct income_index from features_md where income = argincome")
val age     = hiveContext.sql("select distinct age_index from features_md where age = argage") 
val gender  = hiveContext.sql("select distinct gender_index from features_md where gender = arggender") 

testpredict_02(Vectors.dense(income.select("income_index"), age.select("age_index"), gender.select("gender_index")))

Error :
<console>:43: error: type mismatch;
 found   : org.apache.spark.sql.DataFrame
 required: Double
              testpredict_02(Vectors.dense(income.select("income_index"), age.select("age_index")))

请帮忙..

【问题讨论】:

  • income.select("income_index") 返回 Dataframe,而不是 Double。所以Vectors.dense(...) 创建了一个包含 3 个数据帧的向量 - 我很确定这不是您想要的,并且在任何方面都没有用。 MyModel.predict 期望什么类型?
  • 谢谢扎克。 MyModel.predict 期望向量为 DOUBLE。收入选择(“收入指数”)资源2:org.apache.spark.sql.DataFrame = [收入指数:双]年龄.选择(“年龄指数”)资源1:org.apache.spark.sql.DataFrame = [年龄指数:双]虽然列数据类型是 Double,但由于 age.select("age_index") 和income.select("income_index") 返回 sql.DataFrame,我遇到了这个问题。请问有没有其他方法可以获取列值。
  • 但是每个 Dataframe 都包含 许多 双精度数据 - Dataframe 是一个分布式的 collection 记录...你想要哪一个?第一的?任何?全部?如果“全部” - 如果 3 个数据框的记录数不同怎么办?你将如何为这些值构建向量?看起来你需要重新设计整个东西 - 这似乎不是 Spark 的正确使用......
  • 再次感谢。我已经确定,在代码中每个数据帧将只有一个 DOUBLE 值(只有一列)。最终我想要的是构建类似 testpredict_02(Vectors.dense(1.0,2.0,2.0)) 的东西,其中的值来自 DataFrame。
  • "one DOUBLE value (only one column)" --> 这是错误的——一个 column 包含多个 values,就像在一个数据库 (en.wikipedia.org/wiki/Column_(database))

标签: scala apache-spark


【解决方案1】:

如果您确定 3 个 Dataframe 中的每一个都包含一列和一条记录,则可以获取每个数据框的第一条记录的第一列:

def getFirstCell(df: DataFrame): Double = df.first().getAs[Double](0)

val vector: Vector = Vectors.dense(
  getFirstCell(income.select("income_index")),
  getFirstCell(age.select("age_index")),
  getFirstCell(gender.select("gender_index"))
)

testpredict_02(vector)

【讨论】:

  • 我会试试这个,让你认识 Tzach。再次感谢您。
  • 三个动作得到一个向量?这是一个矫枉过正,你不觉得:)
  • @Tzach,这个技巧奏效了。谢谢。 zero323,Tzach,我知道设计不对,我会继续努力的。到目前为止,我需要做一个快速的 POC 并测试整个想法。谢谢。
猜你喜欢
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2018-03-05
  • 1970-01-01
  • 2017-02-26
相关资源
最近更新 更多