提问者:小点点

从Spark中包含字符串数组的RDD创建SQLContext数据集[重复]


所以我有一个变量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)找不到存储在数据集中的类型的编码器。通过导入sqlContext. implics支持原始类型(Int,String等)和产品类型(case类)。_将在未来版本中添加对序列化其他类型的支持。val线=sqc.createDataset(数据)

错误:(12,34)方法createDataset的参数不足:(隐式证据4美元:org. apache.park.sql.Encoder[Array[String]])org.apache.park.sql.Dataset[Array[String]]。未指定的值参数证据4美元。val线=sqc.createDataset(数据)

当然,我知道我需要传递编码器参数,但是,在这种情况下会是什么以及如何导入编码器?当我自己尝试时,它说createDataset不将其作为参数。

有类似的问题,但他们没有回答如何使用编码器参数。如果我的RDD是一个RDD[String]它工作得很好,但是在这种情况下它是RDD[Array[String]]


共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的含义。_sqlContext如下

val sqc = new SQLContext(sc)
import sqc.implicits._
rdd.toDF().show(false)

你应该有dataframe作为

+------+
|value |
+------+
|[a, b]|
|[d, e]|
|[g, f]|
|[e, r]|
+------+

这不是很简单吗?