scala – 在Apache Spark 1.3中将列添加到数据框

是可能的,什么是最有效的整洁方法添加列到数据框?

更具体地,列可以用作现有数据帧的行ID。

在一个简单的情况下,从文件读取,而不是标记化它,我可以想到的东西如下(在Scala),但它完成与错误(在第3行),反正看起来不像最好的路线可能:

var dataDF = sc.textFile("path/file").toDF() 
val rowDF = sc.parallelize(1 to DataDF.count().toInt).toDF("ID") 
dataDF = dataDF.withColumn("ID", rowDF("ID")) 
这是一段时间,因为我发布的问题,似乎一些其他人想得到一个答案以及。下面是我发现的。

因此,原始任务是向任何给定数据帧添加一个带有行标识符(基本上,序列1到numRows)的列,因此可以跟踪行顺序/在场(例如,当您进行抽样时)。这可以通过以下方式实现:

sqlContext.textFile(file).
zipWithIndex().
map(case(d, i)=>i.toString + delimiter + d).
map(_.split(delimiter)).
map(s=>Row.fromSeq(s.toSeq))

关于将任何列附加到任何数据框架的一般情况:

Spark API中“最接近”此功能的是withColumn和withColumnRenamed。根据Scala docs,前者通过添加列返回一个新的DataFrame。在我看来,这是一个有点混乱和不完整的定义。这两个函数只能对这个数据帧进行操作,即给定具有列col的两个数据帧df1和df2:

val df = df1.withColumn("newCol", df1("col") + 1) // -- OK
val df = df1.withColumn("newCol", df2("col") + 1) // -- FAIL

因此,除非可以将现有数据帧中的列转换为所需的形状,否则不能使用withColumn或withColumnRenamed来附加任意列(独立或其他数据帧)。

正如上面所说的,解决方案的解决方案可能是使用连接 – 这将是相当混乱,虽然可能 – 附上像zipWithIndex这样的唯一键到数据框架或列可能工作。虽然效率是…

很明显,将一个列附加到数据框架对于分布式环境不是一个简单的功能,并且可能没有一个非常有效,整洁的方法。但我认为,这个核心功能仍然非常重要,即使有性能警告。

http://stackoverflow.com/questions/29483498/append-a-column-to-data-frame-in-apache-spark-1-3

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:scala – 在Apache Spark 1.3中将列添加到数据框