将 RDD 转换为数据帧 int vs Double

Converting RDD into a dataframe int vs Double

为什么可以使用隐式方法将 rdd[int] 转换为数据帧

import sqlContext.implicits._

//Concatenate rows
val rdd1 = sc.parallelize(Array(4,5,6)).toDF()
rdd1.show()

rdd1: org.apache.spark.sql.DataFrame = [_1: int]
+---+
| _1|
+---+
|  4|
|  5|
|  6|
+---+

但是 rdd[Double] 抛出一个错误:

val rdd2 = sc.parallelize(Array(1.1,2.34,3.4)).toDF()
error: value toDF is not a member of org.apache.spark.rdd.RDD[Double]

火花2.x

在 Spark 2.x toDF 中使用 SparkSession.implicits 并为具有 Encoder 的任何类型提供 rddToDatasetHolderlocalSeqToDatasetHolder 因此

val spark: SparkSession = ???
import spark.implicits._

两者:

Seq(1.1, 2.34, 3.4).toDF()

sc.parallelize(Seq(1.1, 2.34, 3.4)).toDF()

有效。

火花1.x

这是不可能的。排除 Product 类型 SQLContext 仅为 RDD[Int] (intRddToDataFrameHolder)、RDD[Long] (longRddToDataFrameHolder) 和 RDD[String] (stringRddToDataFrameHolder).您总是可以先 mapRDD[(Double,)]

sc.parallelize(Seq(1.1, 2.34, 3.4)).map(Tuple1(_)).toDF()