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

时间:2017-12-04 08:13:34

标签: scala apache-spark dataset rdd apache-spark-1.6

所以我的变量dataRDD[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]]

1 个答案:

答案 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]|
+------+

这不是很简单吗?