小编典典

在Apache Spark 1.3中将列追加到数据帧

python

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

更具体地说,列可以用作现有数据帧的行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")) 

阅读 154

收藏
2020-12-20

共1个答案

小编典典

自从我发布问题以来已经有一段时间了,似乎还有其他人也希望得到答案。以下是我发现的内容。

因此,最初的任务是将带有行标识符的列(基本上是一个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) // -- OK
val df = df1.withColumn("newCol", df2("col") + 1) // -- FAIL

因此,除非您可以设法将现有数据框中的列转换为所需的形状,withColumn否则您将无法使用或withColumnRenamed添加任意列(独立或其他数据框)。

如上文所述,解决方法可能是使用join-尽管可能,但会很混乱-将上述唯一键附加zipWithIndex到数据框或列都可能有效。虽然效率是…

显然,对于分布式环境而言,将一列添加到数据框并不是一件容易的功能,并且根本不可能有非常有效,整洁的方法。但是我认为,即使有性能警告,也要提供此核心功能仍然非常重要。

2020-12-20