spark数据帧到Scala中的pairedRDD

spark数据帧到Scala中的pairedRDD,scala,apache-spark,spark-dataframe,rdd,Scala,Apache Spark,Spark Dataframe,Rdd,我是Spark的新手,我想将dataframe转换为pairedRDD。我的数据框看起来像: tagname,value,Minute tag1,13.87,5 tag2,32.50,10 tag3,35.00,5 tag1,10.98,2 tag5,11.0,5 我想要PairedRDD(标记名,值)。我试过了 我得到以下错误: error: constructor cannot be instantiated to expected type 非常感谢你的帮助。提前感谢。org.apac

我是Spark的新手,我想将dataframe转换为pairedRDD。我的数据框看起来像:

tagname,value,Minute
tag1,13.87,5
tag2,32.50,10
tag3,35.00,5
tag1,10.98,2
tag5,11.0,5
我想要PairedRDD(标记名,值)。我试过了

我得到以下错误:

error: constructor cannot be instantiated to expected type

非常感谢你的帮助。提前感谢。

org.apache.spark.sql.Row
为某些数据类型提供了自定义的
get
方法

val df = sc.parallelize(List(
("tag1",13.87,5),
("tag2",32.50,10),
("tag3",35.00,5),
("tag1",10.98,2),
("tag5",11.0,5)
)).toDF("tagname", "value", "minute")

val pairedRDD = df.map(x => (x.getString(0), x.getDouble(1) ) )

pairedRDD.collect

Array[(String, Double)] = Array((tag1,13.87), (tag2,32.5), (tag3,35.0), (tag1,10.98), (tag5,11.0))

然后可以调用
pairedRDD.collect.toMap
将其转换为Scala映射。问题中有两个名为
tag1
的键,这是不正确的。

org.apache.spark.sql.Row
具有针对特定数据类型的自定义
get
方法

val df = sc.parallelize(List(
("tag1",13.87,5),
("tag2",32.50,10),
("tag3",35.00,5),
("tag1",10.98,2),
("tag5",11.0,5)
)).toDF("tagname", "value", "minute")

val pairedRDD = df.map(x => (x.getString(0), x.getDouble(1) ) )

pairedRDD.collect

Array[(String, Double)] = Array((tag1,13.87), (tag2,32.5), (tag3,35.0), (tag1,10.98), (tag5,11.0))

然后可以调用
pairedRDD.collect.toMap
将其转换为Scala映射。问题中有两个名为
tag1
的键,这是不正确的。

从RDD.SCALA中,映射返回MapPartitionsRDD。你不能直接把它放到地图上。只需删除“Map[String,Long]”即可。

从RDD.SCALA中,Map返回MapPartitionsRDD。你不能直接把它放到地图上。只需删除“Map[String,Long]”就可以了。

我会使用
数据集。作为

import org.apache.spark.rdd.RDD

val df = Seq(
  ("tag1", "13.87", "5"), ("tag2", "32.50", "10"), ("tag3", "35.00", "5"), 
  ("tag1", "10.98", "2"), ("tag5", "11.0", "5")
).toDF("tagname", "value", "minute")

val pairedRDD: RDD[(String, Double)] = df
  .select($"tagname", $"value".cast("double"))
  .as[(String, Double)].rdd

我会使用数据集。如

import org.apache.spark.rdd.RDD

val df = Seq(
  ("tag1", "13.87", "5"), ("tag2", "32.50", "10"), ("tag3", "35.00", "5"), 
  ("tag1", "10.98", "2"), ("tag5", "11.0", "5")
).toDF("tagname", "value", "minute")

val pairedRDD: RDD[(String, Double)] = df
  .select($"tagname", $"value".cast("double"))
  .as[(String, Double)].rdd

您可以发布您尝试过的代码吗?我尝试了“val byKey:Map[String,Long]=winowFiveRDD.Map({case(tagname,value)=>(tagname)->value})”。但是我遇到了一个错误,你能发布你尝试过的代码吗?我尝试了“val byKey:Map[String,Long]=winowFiveRDD.Map({case(tagname,value)=>(tagname)->value})”。但我有个错误,我试过了。在x.getDouble(1)的情况下,我得到的错误是org.apache.spark.sparkeexception:作业由于阶段失败而中止:阶段65.0中的任务0失败了4次,最近的失败:阶段65.0中的任务0.3丢失(TID 96,10.0.0.14,执行器2):java.lang.ClassCastException:java.lang.String不能转换为java.lang.Double您能用数据帧的
printSchema
更新您的问题吗?如果第二列
value
是String,那么应该只使用
x.getString(1)
Yes值也是String。但是我想要两份,这样我可以对它们进行进一步的处理。谢谢如果您完全肯定在该列中始终会有一个有效的double值,那么您可以执行
x.get(1).asInstanceOf[double]
,但我仍然建议更改数据帧的模式,在开始时将该列作为double加载。我已经尝试过了。在x.getDouble(1)的情况下,我得到的错误是org.apache.spark.sparkeexception:作业由于阶段失败而中止:阶段65.0中的任务0失败了4次,最近的失败:阶段65.0中的任务0.3丢失(TID 96,10.0.0.14,执行器2):java.lang.ClassCastException:java.lang.String不能转换为java.lang.Double您能用数据帧的
printSchema
更新您的问题吗?如果第二列
value
是String,那么应该只使用
x.getString(1)
Yes值也是String。但是我想要两份,这样我可以对它们进行进一步的处理。谢谢如果您完全肯定在该列中始终会有一个有效的double值,那么您可以执行
x.get(1).asInstanceOf[double]
,但我仍然建议更改数据帧的模式,在开始时将该列作为double加载。我已经尝试过了。它显示错误:构造函数无法实例化为预期类型;我已经试过了。它显示错误:构造函数无法实例化为预期类型;