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

更具体地说,列可以用作现有数据帧的行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 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中与此功能最接近的是withColumnwithColumnRenamed。根据Scala docs,前者通过添加列来返回新的DataFrame。我认为这是一个有点困惑和不完整的定义。这两个函数只能在this数据帧上操作,即给定两个数据帧df1df2的列col:
val df = df1.withColumn("newCol", df1("col") + 1) // -- OK
val df = df1.withColumn("newCol", df2("col") + 1) // -- FAIL

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

如上文所述,解决方法可能是使用join-尽管可能,但这样做会很杂乱-将上面带有zipWithIndex的唯一键附加到数据帧或列上可能有效。虽然效率是...

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

关于scala - 在Apache Spark 1.3中将列追加到数据帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29483498/

10-12 17:39
查看更多