我发布这个问题已经有一段时间了,似乎还有其他人也想得到答案。以下是我发现的内容。
所以原始任务就是将一个带有行标识符的列(基本上是序列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文档,前者通过添加列返回新的数据框。在我看来,这个定义有点令人困惑且不完整。这两个函数只能操作this
数据帧(即当前数据帧),即给定两个数据帧df1
和df2
,以及列col
:
val df = df1.withColumn("newCol", df1("col") + 1)
val df = df1.withColumn("newCol", df2("col") + 1)
因此,除非您能够将现有数据框中的列转换为所需的形状,否则无法使用withColumn
或withColumnRenamed
来附加任意列(独立的或其他数据框)。
如上所述,解决方法可能是使用join
,虽然这可能会很麻烦 - 使用zipWithIndex
将唯一键附加到两个数据框或列,类似于上面的方法可能有效。虽然效率可能不高...
很明显,在分布式环境中添加列到数据框并不是一项容易的功能,并且可能没有非常高效和简洁的方法。但我认为,即使有性能警告,拥有这个核心功能仍然非常重要。
dataDF = dataDF.withColumn("ID", dataDF("ID").map(...))
只能使用“this”数据框架的列,而不能使用其他数据框架的列。 - Oleg Shirokikhjoin
。这是一个不错的候选项,可以建议加强API。 - ChetsqlContext.udf().register("...
的东西) - Thomas Decaux