toDF() 不处理 RDD

toDF() not handling RDD

我有一个名为 RowRDD 的行 RDD。我只是想转换成 DataFrame。从我在互联网上从不同地方看到的例子,我看到我应该尝试 RowRDD.toDF() 我收到错误:

value toDF is not a member of org.apache.spark.rdd.RDD[org.apache.spark.sql.Row]

它不起作用,因为 Row 不是 Product 类型,并且具有单个 RDD 参数的 createDataFrame 仅为 RDD[A] 定义,其中A <: Product.

如果您想使用 RDD[Row],您必须提供一个模式作为第二个参数。如果您考虑一下,那应该是显而易见的。 Row 只是 Any 的一个容器,因此它没有为模式推断提供足够的信息。

假设这与 中定义的 RDD 相同,那么模式很容易生成:

import org.apache.spark.sql.types._
import org.apache.spark.rdd.RD

val rowRdd: RDD[Row] = ???
val schema = StructType(
  (1 to rowRdd.first.size).map(i => StructField(s"_$i", StringType, false))
)

val df = sqlContext.createDataFrame(rowRdd, schema)