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

Creating a SQLContext Dataset from an RDD containing arrays of Strings in Spark

所以我有一个变量 data,它是一个 RDD[Array[String]]。我想遍历它并比较相邻的元素。为此,我必须从 RDD 创建一个数据集。

我尝试以下操作,sc 是我的 SparkContext:

import org.apache.spark.sql.SQLContext

val sqc = new SQLContext(sc)
val lines = sqc.createDataset(data)

我得到以下两个错误:

Error:(12, 34) Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing sqlContext.implicits._ Support for serializing other types will be added in future releases. val lines = sqc.createDataset(data)

Error:(12, 34) not enough arguments for method createDataset: (implicit evidence: org.apache.spark.sql.Encoder[Array[String]])org.apache.spark.sql.Dataset[Array[String]]. Unspecified value parameter evidence. val lines = sqc.createDataset(data)

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

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

问题中的所有评论都试图告诉你以下事情

你说你有 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,但在此之前,您需要将sqlContextimport implicits._作为以下

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

你应该 dataframe 作为

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

这一切是不是很简单?