所以我的变量data
是RDD[Array[String]]
。我想迭代它并比较相邻的元素。为此,我必须从RDD创建一个数据集。
我尝试以下操作,sc
是我的SparkContext
:
import org.apache.spark.sql.SQLContext
val sqc = new SQLContext(sc)
val lines = sqc.createDataset(data)
我得到以下两个错误:
错误:(12,34)无法找到存储在数据集中的类型的编码器。 基元类型(Int,String等)和产品类型(案例类) 通过导入sqlContext.implicits._支持 序列化其他类型将在未来的版本中添加。 val lines = sqc.createDataset(data)
错误:(12,34)方法createDataset的参数不足: (隐含证据4美元: org.apache.spark.sql.Encoder [阵列[字符串]])org.apache.spark.sql.Dataset [数组[字符串]]。 未指定的值参数证据$ 4。 val lines = sqc.createDataset(data)
当然,我知道我需要传递一个Encoder参数,但是,在这种情况下它会是什么以及如何导入编码器?当我尝试自己时,它表示createDataset
不会将其作为论据。
有类似的问题,但他们没有回答如何使用编码器参数。如果我的RDD是RDD[String]
,它的效果非常好,但在这种情况下它是RDD[Array[String]]
。
答案 0 :(得分:1)
问题中的所有评论都试图告诉您以下事项
你说你有RDD[Array[String]]
,我通过以下方式创建
val rdd = sc.parallelize(Seq(Array("a", "b"), Array("d", "e"), Array("g", "f"), Array("e", "r"))) //rdd: org.apache.spark.rdd.RDD[Array[String]] = ParallelCollectionRDD[0] at parallelize at worksheetTest.sc4592:13
现在将rdd
转换为dataframe
即可致电.toDF
但在此之前您需要import
implicits._
sqlContext
,如下所示< / p>
val sqc = new SQLContext(sc)
import sqc.implicits._
rdd.toDF().show(false)
您应该dataframe
作为
+------+
|value |
+------+
|[a, b]|
|[d, e]|
|[g, f]|
|[e, r]|
+------+
这不是很简单吗?