Pra*_*akh 7 scala apache-spark apache-spark-sql
为什么以下结果会出错?
scala> import sqlContext.implicits._
import sqlContext.implicits._
scala> val rdd = sc.parallelize(1 to 10).map(x => (Map(x -> 0), 0))
rdd: org.apache.spark.rdd.RDD[(scala.collection.immutable.Map[Int,Int], Int)] = MapPartitionsRDD[20] at map at <console>:27
scala> rdd.toDF
res8: org.apache.spark.sql.DataFrame = [_1: map<int,int>, _2: int]
scala> val rdd = sc.parallelize(1 to 10).map(x => Map(x -> 0))
rdd: org.apache.spark.rdd.RDD[scala.collection.immutable.Map[Int,Int]] = MapPartitionsRDD[23] at map at <console>:27
scala> rdd.toDF
<console>:30: error: value toDF is not a member of org.apache.spark.rdd.RDD[scala.collection.immutable.Map[Int,Int]]
rdd.toDF
Run Code Online (Sandbox Code Playgroud)
那么到底发生了什么,toDF可以将RDD类型转换(scala.collection.immutable.Map[Int,Int], Int)
为DataFrame而不是类型scala.collection.immutable.Map[Int,Int]
.这是为什么?
zer*_*323 10
出于同样的原因你不能使用
sqlContext.createDataFrame(1 to 10).map(x => Map(x -> 0))
Run Code Online (Sandbox Code Playgroud)
如果您查看org.apache.spark.sql.SQLContext
源代码,您会发现该createDataFrame
方法的两种不同实现:
def createDataFrame[A <: Product : TypeTag](rdd: RDD[A]): DataFrame
Run Code Online (Sandbox Code Playgroud)
和
def createDataFrame[A <: Product : TypeTag](data: Seq[A]): DataFrame
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,两者都需要A
成为它的子类Product
.当你打电话toDF
给RDD[(Map[Int,Int], Int)]
它时,因为Tuple2
确实是一个Product
.Map[Int,Int]
因此本身并不是错误.
你可以把它通过包装工作Map
有Tuple1
:
sc.parallelize(1 to 10).map(x => Tuple1(Map(x -> 0))).toDF
Run Code Online (Sandbox Code Playgroud)
基本上是因为没有隐式为RDD内的Map创建DataFrame.
在第一个示例中,您将返回一个Tuple,它是一个隐式转换的Product.
rddToDataFrameHolder [A <:Product:TypeTag](rdd:RDD [A])
在第二个示例中,您使用RDD中的Map,没有隐式转换.
归档时间: |
|
查看次数: |
5588 次 |
最近记录: |