rdd已按以下格式创建 Array[Array[String]]
具有以下值:
val rdd : Array[Array[String]] = Array(
Array("4580056797", "0", "2015-07-29 10:38:42", "0", "1", "1"),
Array("4580056797", "0", "2015-07-29 10:38:43", "0", "1", "1"))
我要使用以下架构创建Dataframe:
val schemaString = "callId oCallId callTime duration calltype swId"
下一步:
scala> val rowRDD = rdd.map(p => Array(p(0), p(1), p(2),p(3),p(4),p(5).trim))
rowRDD: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[14] at map at <console>:39
scala> val calDF = sqlContext.createDataFrame(rowRDD, schema)
出现以下错误:
console:45: error: overloaded method value createDataFrame with alternatives:
(rdd: org.apache.spark.api.java.JavaRDD[_],beanClass: Class[_])org.apache.spark.sql.DataFrame <and>
(rdd: org.apache.spark.rdd.RDD[_],beanClass: Class[_])org.apache.spark.sql.DataFrame <and>
(rowRDD: org.apache.spark.api.java.JavaRDD[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType)org.apache.spark.sql.DataFrame <and>
(rowRDD: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType)org.apache.spark.sql.DataFrame
cannot be applied to (org.apache.spark.rdd.RDD[Array[String]],
org.apache.spark.sql.types.StructType)
val calDF = sqlContext.createDataFrame(rowRDD, schema)
4条答案
按热度按时间idv4meu81#
使用
spark 1.6.1
以及scala 2.10
我也犯了同样的错误error: overloaded method value createDataFrame with alternatives:
对我来说,抓住你就是我的签名createDataFrame
,我想用val rdd : List[Row]
,但失败的原因是java.util.List[org.apache.spark.sql.Row]
以及scala.collection.immutable.List[org.apache.spark.sql.Row]
都不一样。我找到的解决办法是
val rdd : Array[Array[String]]
进入RDD[Row]
通过List[Array[String]]
. 我发现这是最接近的文件0mkxixxg2#
我想你的
schema
如Spark指南中所示,如下所示:如果您查看createdataframe的签名,下面是一个接受structtype作为第二个参数的签名(对于scala)
def createdataframe(rowrdd:rdd[row],schema:structtype):Dataframe
使用给定的模式从包含行的rdd创建Dataframe。
所以它接受作为第一个论点
RDD[Row]
. 你身上有什么rowRDD
是一个RDD[Array[String]]
因此存在不匹配。你需要一个
RDD[Array[String]]
?否则,您可以使用以下方法创建Dataframe:
zrfyljdw3#
只需粘贴到
spark-shell
:那么
map()
在rdd上创建case类的示例,然后使用toDF()
:这将从case类推断模式。
然后您可以继续:
如果你想用
toDF()
在正常程序中(不是在spark-shell
),确保(此处引用):至
import sqlContext.implicits._
就在创建SQLContext
使用在方法外定义case类toDF()
5gfr0r5j4#
你需要先改变你的信仰
Array
进入Row
然后定义模式。我假设你的大部分领域Long
```val rdd: RDD[Array[String]] = ???
val rows: RDD[Row] = rdd map {
case Array(callId, oCallId, callTime, duration, swId) =>
Row(callId.toLong, oCallId.toLong, callTime, duration.toLong, swId.toLong)
}