自从我发布问题以来已经有一段时间了,似乎还有其他人也希望得到答案。以下是我发现的内容。
因此,最初的任务是将带有行标识符的列(基本上是一个sequence 1 to 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的文档,前者通过添加列来返回新的Dataframe。我认为这是一个有点混乱和不完整的定义。这两个函数只能在this数据帧上运行,即给定两个数据帧,df1并且df2具有column col:
val df = df1.withColumn("newCol", df1("col") + 1) // -- OKval df = df1.withColumn("newCol", df2("col") + 1) // -- FAIL
因此,除非您可以设法将现有数据框中的列转换为所需的形状,withColumn否则您将无法使用或withColumnRenamed添加任意列(独立或其他数据框)。
如上文所述,解决方法可能是使用join-尽管可能,但会很混乱-将上述唯一键附加zipWithIndex到数据框或列都可能有效。虽然效率是…
显然,对于分布式环境而言,将一列添加到数据框并不是一件容易的功能,并且根本不可能有非常有效,整洁的方法。但是我认为,即使有性能警告,也要提供此核心功能仍然非常重要。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)