为什么可以使用隐式方法
将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]
答案 0 :(得分:4)
Spark 2.x
在Spark 2.x toDF
中使用SparkSession.implicits
并为rddToDatasetHolder
提供localSeqToDatasetHolder
和Encoder
,因此
val spark: SparkSession = ???
import spark.implicits._
两个
Seq(1.1, 2.34, 3.4).toDF()
和
sc.parallelize(Seq(1.1, 2.34, 3.4)).toDF()
有效。
Spark 1.x
这是不可能的。排除Product
类型SQLContext
仅为RDD[Int]
(intRddToDataFrameHolder
),RDD[Long]
(longRddToDataFrameHolder
)和RDD[String]
提供隐式转化({ {1}})。您可以始终stringRddToDataFrameHolder
至map
:
RDD[(Double,)]