Spark 2.0 Scala - RDD.toDF()

23

我正在使用Spark 2.0 Scala。我可以使用toDF()方法将RDD转换为DataFrame。

val rdd = sc.textFile("/pathtologfile/logfile.txt")
val df = rdd.toDF()

但是我死活找不到它在API文档的哪里。它不在RDD下面。但是它在DataSet下面 (链接1)。然而我有一个RDD,而不是DataSet。

此外,我在隐式转换中也找不到它 (链接2)。

所以请帮助我理解为什么可以对我的RDD调用toDF()方法。这个方法从哪里继承而来?


你是从哪里调用这个的?spark-shell? - Yuval Itzchakov
是的。只需设置本地Spark并运行我的Scala脚本,使用以下命令:./bin/spark-shell --master local[2] -i /pathtomyscale/myfile.scala - Carl
4个回答

21

来源于这里:

Spark 2 API

解释:如果你导入sqlContext.implicits._,你就有了一个将RDD转换成DataSetHolderrddToDataSetHolder)的隐式方法,然后在DataSetHolder上调用toDF方法。


太棒了!现在我明白那个方法是从哪里来的了。 - Carl

5

是的,您应该像这样导入sqlContext implicits:

val sqlContext = //create sqlContext

import sqlContext.implicits._

val df = RDD.toDF()

在调用RDD的“toDF”之前


我不需要导入它。我的代码可以直接使用。也许它是自动导入的?但我不明白的是,为什么在API文档中的隐式转换中没有看到toDF()方法?它是从哪里来的? - Carl
嗯,好的,抱歉我理解错了你的问题。我找到了它在 Dataset.scala 中的位置,但是我不知道它是如何被导入的 :Shttps://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/Dataset.scala - DanielVL

2

是的,我终于找到了解决这个问题的方法。这个问题困扰着我很久,这篇文章真是救了我一命。我正在尝试从日志文件中泛型地加载数据到一个可变的 List,并将其转换为 DF。然而,由于它是可变的,而 Spark 2.1.1 已经改变了 toDF 的实现方式,无论如何列表都无法被转换。最后,我甚至想到将数据保存到文件中,然后使用 .read 将其加载回来。但是,5 分钟前这篇文章就救了我的一天。

我按照描述中的完全相同的方式进行了操作。

在将数据加载到可变列表后,我立即使用了

import spark.sqlContext.implicits._
val df = <mutable list object>.toDF 
df.show()

1
我已经用Spark 2完成了这个任务,它成功了。
val orders = sc.textFile("/user/gd/orders")
val ordersDF = orders.toDF()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接