Scala 在RDD中添加新列

Scala 在RDD中添加新列,scala,apache-spark-sql,rdd,Scala,Apache Spark Sql,Rdd,嗨,我正在尝试为Spark RDD创建一个新专栏。我尝试在一个数据集中添加出版商制作的游戏在所有游戏中的百分比。 数据集如下所示: 名称、平台、年份、流派、出版商、NA_销售、EU_销售、JP_销售、其他_销售 val vgdataLines = sc.textFile("hdfs:///user/ashhall1616/bdc_data/t1/vgsales-small.csv") val vgdata = vgdataLines.map(_.split(";")) def toPercent

嗨,我正在尝试为Spark RDD创建一个新专栏。我尝试在一个数据集中添加出版商制作的游戏在所有游戏中的百分比。 数据集如下所示:

名称、平台、年份、流派、出版商、NA_销售、EU_销售、JP_销售、其他_销售

val vgdataLines = sc.textFile("hdfs:///user/ashhall1616/bdc_data/t1/vgsales-small.csv")
val vgdata = vgdataLines.map(_.split(";"))
def toPercentage(x: Double): Double = {x * 100} val countPubl  = vgdata.map(r =>  (r(4),1)).reduceByKey(_+_)
val addpercen = countPubl.withColumn("count", toPercentage($"count"/countPubl.count(_._2)))
我使用
withColumn()
添加新列“count”,预期输出如下:

(育碧软件,3,15.0)


有人能告诉你这里出了什么问题吗?

你不能将
与列
一起使用RDD,因此请将其转换为数据帧,如下所示,然后使用它

val countPubl : DataFrame  = vgdata.map(r =>  (r(4),1)).reduceByKey(_+_).toDF()
如果您仍然希望使用RDD,那么只要在添加列后将其转换回RDD即可

val javaRdd : JavaRDD[Row] = countPubl.withColumn("...",col("...")).toJavaRDD
不能将“withColumn”与RDD一起使用。 你可以这样做

val addpercen = countPubl.map({case(key, value) => (key, value, toPercentage(value))})
使用“映射”将计算值添加为新列,并根据需要转换为数据帧

import spark.implicits._
val myDf = addpercen.toDF("key","value","myNewColumn") 

myDf.show()

希望有帮助。

好的,但是如果我想在RDD中使用相同的逻辑怎么办?
scala>val-javaRdd:javaRdd[Row]=countPubl.withColumn(“count”,toPercentage($“count”/countPubl.count($”count)/countPubl.count($)。toJavaRDD:32:找不到错误:键入javaRdd-val-javaRdd:javaRdd:javaRdd[Row]=countPubl.withColumn(“count”,toPercentage($”count)/countPubl.count.count($)).toJavaRDD^
:32:错误:value withColumn不是org.apache.spark.rdd.rdd[(字符串,Int)]val javaRdd:javaRdd[Row]=countPubl.withColumn(“count”,toPercentage($“count”/countPubl.count(u.2))的成员.toJavaRDD^
:32:错误:方法count的参数太多:()Long val javaRdd:javaRdd[Row]=countPubl.withColumn(“count”,toPercentage($“count”/countPubl.count(u._2))).toJavaRDD^
添加我的第一行,然后使用第二行